Data preparation script for Sierra Nevada time series analysis

Merge templates with 14C, C, and N data

Radiocarbon analyses for the 2001 samples were not run originally, but were completed on archived samples in 2020.

2001 mean radiocarbon profiles

Fig. 10. Mean profile \(\Delta\)14C for 2001 samples

Caption: Mean \(\Delta\)14C by depth for each site in 2001. Error bars show ±1 standard deviation, solid vertical line shows \(\Delta\)14C of the atmosphere in the year of sampling.

2009 radiocarbon profiles

Fig. 10. Profile \(\Delta\)14C for 2009 samples

Caption: Profile \(\Delta\)14C by depth for each site in 2009. Solid vertical line shows \(\Delta\)14C of the atmosphere in the year of sampling. Error bars not shown as only a single replicate profile was analyzed per site.

2019 mean radiocarbon profiles

Fig. 10. Mean profile \(\Delta\)14C for 2019 samples

Caption: Mean \(\Delta\)14C by depth for each site in 2019. Error bars show ±1 standard deviation, solid vertical line shows \(\Delta\)14C of the atmosphere in the year of sampling.

Change in \(\Delta\)14C over time between 2001 and 2019

Fig. 10. Mean profile \(\Delta\)14C for 2001 and 2019 samples

Caption: Mean \(\Delta\)14C by depth for each site in 2001 and 2019. Error bars show ±1 standard deviation. Vertical lines show \(\Delta\)14C of the atmosphere in 2001 (solid) and 2019 (dashed).

Incubation \(\Delta\)14C-CO2 for 2019 bulk soils

Fig. 10. Rep 1 \(\Delta\)14C-CO2 of 2019 bulk soil incubations

Caption: \(\Delta\)14CO2 by depth for each site in 2019. (Still waiting for data from laboratory duplicates). Note that the 10-20 cm increment sample from the cold granite site appears to have been contaminated: \(\Delta\)14C-CO2 = -396.7.

Incubation vs. bulk soil \(\Delta\)14C

Fig. 10. \(\Delta\)14C of 2019 bulk soil incubations and corresponding bulk soil

Caption: \(\Delta\)14C of bulk soil and respired CO2 by depth for each site in 2019. Error bars show one standard deviation for bulk soil, points show mean of three replicate profiles for bulk soils and single observations for respired CO2 (still waiting for data from laboratory duplicates).

Fig. 10. Regression of 2019 bulk soil incubations and corresponding bulk soil \(\Delta\)14C

Caption: Regressions of \(\Delta\)14C of bulk soil and respired CO2 by depth for each site in 2019. Error bars show one standard deviation for bulk soil, points show mean of three replicate profiles for bulk soils and single observations for respired CO2 (still waiting for data from laboratory duplicates).

Time series: \(\Delta\)14C by depth (as measured)

Fig. 10. Time series of \(\Delta\)14C by depth, as measured

Caption: Points show mean of three profile replicates for 2001 and 2019 samples. Error bars show ± 1 standard deviation of the mean (only a single profile was analyzed in 2009).

Spline fitting

Fit splines to 2009 data to predict at 2001 depths

Soils collected in both the 2001 and 2009 sampling campaigns were sampled by horizon, but the depth intervals differed between the two sampling years. In 2009, full profiles were excavated for each site, as opposed to the shorter profiles collected in 2001 from the GR and AN sites. Radiocarbon was measured on all three replicate profiles at each site for the 2001 samples, but only for one of the replicate profiles at each site in 2009, e.g. ANpp rep2, etc.

In order to compare the radiocarbon profiles between 2001, 2009, and 2019 we interpolated both radiocarbon and carbon stock data at 1 cm intervals for each site in the 2009 and 2019 datasets, and then summed the carbon-stock-weighted radiocarbon values for each depth interval sampled in 2001. A monotonic cubic spline fit was used for the carbon stock interpolation (Wendt and Hauser 2013), and a mass-preserving spline was used to fit the radiocarbon data (Bishop, T.F.A., McBratney, A.B., Laslett, G.M., (1999) Modelling soil attribute depth functions with equal-area quadratic smoothing splines. Geoderma, 91(1-2): 27-45).

Fig. 10. Time series of \(\Delta\)14C by depth (2001, 2009, 2019)

Caption: Points for 2001 samples show the mean \(\Delta\)14C values at the measured depths. Points for 2009 and 2019 samples are spline-fitted estimates of \(\Delta\)14C predicted for the same depth intervals as measured in 2001. Error bars show ± 1 standard deviation of the mean of three replicate profiles for 2001 and 2019 samples (only a single profile was analyzed in 2009).

Fig. 10. Time series of \(\Delta\)14C by depth (splined to 2019 depths)

Caption: Points for 2019 samples show the mean \(\Delta\)14C values at the measured depths. Points for 2001 and 2009 samples are spline-fitted estimates of \(\Delta\)14C predicted for the same depth intervals as measured in 2019. Error bars show ± 1 standard deviation of the mean of three replicate profiles for 2001 and 2019 samples (only a single profile was analyzed in 2009). NB: Only two depth intervals were measured at the cool and cold andesite sites (max depth of 27 and 28 cm, respectively), so linear extrapolation (using the slope of the last 1cm spline-fitted depth increment) was used to extend the profiles to 30 cm.

Initial modeling

The goal of this modeling exercise is to see how parent material and climate/ecosystem affect estimates of soil carbon ages and transit times. Bulk soil 14C observations from 2001, 2009, and 2019 will be used to constrain the carbon models, as well as observations of 14C-CO2 from laboratory soil incubations of soils collected in 2001 and 2019. Previous work has indicated that the carbon stocks at these sites is likely at equilibrium, so we will apply the steady-state assumption to the modeling.

Two-pool models

One pool models have been shown repeatedly to be inadequate for describing soil carbon dynamics. However, as simple models are easier to constrain, we will start with a two-pool parallel and two-series models, as these are the simplest model system beyond the single pool approach.

The two-pool parallel model requires the following parameters: * decomposition constants for each pool (k1, k2) * input partitioning coefficient (\(\gamma\)) * steady-state carbon stocks (C) * inputs (I) * initial values of 14C

The two-pool series model requires the following parameters: * decomposition constants for each pool (k1, k2) * transfer coefficient (\(\alpha\)) * steady-state carbon stocks (C) * inputs (I) * initial values of 14C

Decomposition rates (k) are related to the amount of 14C in a pre-bomb system (fraction modern, F) at steady-state by the following equations (cf. Schuur, Druffle, and Trumbore, 2016): >Eq. 1

\[F = \frac{k}{k + \lambda}\] >Eq. 2

\[k = \frac{\lambda \cdot F}{1 - F}\] >where \(\lambda\) is the radioactive decay constant (1/8267).

As the decomposition rates will vary, the initial 14C content can be determined dynamically with equation 1.

Carbon stocks are known, while inputs will be estimated and are related to the steady-state conditions by the following equation: >Eq. 3

\[I = (k_{1} \cdot C_{1}) + (k_{2} \cdot C_{2})\] >where C1 and C2 are the carbon stocks of the two model pools.

Both stocks and inputs can be scaled to the known value of the total carbon pool once the steady-state parameters (k1, k2, and \(\gamma\) or \(\alpha\)) have been determined. Pool sizes are a function of the inputs and input partitioning coefficient at steady-state.

A Monte-Carlo Markov chain approach will be used for parameter estimation in combination with an initial optimization algorithm to determine the best set of initial parameters.

Workflow

Initial model fitting was performed for both model structures using generous parameter ranges [0, 1] for all three parameters (k1, k2, \(\gamma\) or \(\alpha\)). The initial parameter set was found by fitting the models by eye, followed by optimization with the function “modFit” (R package FME), using the Nelder-Mead algorithm. The best set of parameters found by modFit was then used as the input to a Monte Carlo Markov Chain (MCMC), using the function “modMCMC” (R package FME). The number of iterations for the MCMC optimization was set at 5000 intially, with delayed rejection employed to increase efficiency.

The sum of the mean squared error for the best parameter set was slightly lower for the parallel structure than for the series structure. Additionally, the overall mean error of the residuals was also lower for the parallel structure, moderately so for the bulk C observations but substantially so for the respiration observations (in andesite and granite soils in particular).

However, these initial fits yielded unrealistic parameter estimates for multiple sites, particularly at the lower depths. Additionally, the modFit output showed very high correlation between the parameters for both model structures (slightly higher for the two-pool series model).

[[1]]

[[2]]

[[3]]

[[4]]

[[5]]

[[6]]

[[7]]

[[8]]

[[9]]

[[1]]

[[2]]

[[3]]

[[4]]

[[5]]

[[6]]

[[7]]

[[8]]

[[9]]

Bayesian parameter estimation (MCMC)

This section needs some work.

LS0tCnRpdGxlOiAiU2llcnJhIE5ldmFkYSBUaW1lIFNlcmllcyIKYXV0aG9yOiAiSi4gQmVlbS1NaWxsZXIiCmRhdGU6ICIyMSBPY3QgMjAyMCIKb3V0cHV0OgogIHBkZl9kb2N1bWVudDoKICAgIGxhdGV4X2VuZ2luZTogeGVsYXRleAogIGh0bWxfbm90ZWJvb2s6CiAgICB0b2M6IHllcwogICAgdG9jX2RlcHRoOiAyCiAgICBjc3M6IGN1c3RvbS5jc3MKaGVhZGVyX2luY2x1ZGVzOgogIC0gXHVzZXBhY2thZ2VbdXRmOF17aW5wdXRlbmN9CiAgLSBcdXNlcGFja2FnZXtmbG9hdH0KLS0tCmBgYHtyIGdsb2JhbF9vcHRpb25zLCBpbmNsdWRlID0gRkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gRkFMU0UsIHdhcm5pbmcgPSBGQUxTRSwgbWVzc2FnZSA9IEZBTFNFLAogICAgICAgICAgICAgICAgICAgICAgZmlnLmFsaWduID0gJ2NlbnRlcicsIGRldiA9ICdjYWlyb19wZGYnKQpgYGAKCmBgYHtyIHNldHVwLCBpbmNsdWRlID0gRkFMU0V9CmxpYnJhcnkoZ2dwbG90MikKbGlicmFyeShkcGx5cikKIyBzdXBwcmVzcyBncm91cGluZyBpbmZvcm1hdGlvbiBtZXNzYWdlCm9wdGlvbnMoZHBseXIuc3VtbWFyaXNlLmluZm9ybSA9IEZBTFNFKQpsaWJyYXJ5KElTUmFEKQpsaWJyYXJ5KEdTSUYpCmxpYnJhcnkoYXFwKQpsaWJyYXJ5KFNvaWxSKQpsaWJyYXJ5KEZNRSkKbGlicmFyeSh0aWR5cikKYGBgCgojIERhdGEgcHJlcGFyYXRpb24gc2NyaXB0IGZvciBTaWVycmEgTmV2YWRhIHRpbWUgc2VyaWVzIGFuYWx5c2lzCgpgYGB7ciBsb2FkIGFtcy1qZW5hLWluZ2VzdCBmeH0KIyAxLiBSZWFkIGluIGlzb3RvcGUgZGF0YSBmcm9tIHZhcmlvdXMgc291cmNlcwojIEZpcnN0IGxvYWQgaGVscGVyIGZ1bmN0aW9ucyAncmVhZF9qZW5hX2Ftc19yZXN1bHRzLlInLCAncmVhZF9qZW5hX2lzb19yZXN1bHRzLlInIApzb3VyY2UoIi4vdXRpbGl0aWVzL2plbmFfYW1zX2luZ2VzdC5SIikKc291cmNlKCIuL3V0aWxpdGllcy9qZW5hX2lzb19pbmdlc3QuUiIpCnNvdXJjZSgiLi91dGlsaXRpZXMvamVuYV9lbG1faW5nZXN0LlIiKQpgYGAKCmBgYHtyIHJlYWQtY24taXNvLWRhdGEsIGluY2x1ZGUgPSBGQUxTRX0KIyAyLiBOZXh0IHJlYWQgaW4gZGF0YSBmcm9tIHRoZSBhcHByb3ByaWF0ZSBkaXJlY3RvcmllcyBpbiAnZGF0YS9yYXcnCiMgMTRDCiMgaWRlbnRpZnkgc3ViZGlyZWN0b3JpZXMgaW4gJ3JhdycgZGlyZWN0b3J5IHdpdGggImFtc19qZW5hIiBpbiBuYW1lCmFtc19qZW5hX3Jlc3VsdHNfZGlycyA8LSBsaXN0LmZpbGVzKCIuLi9kYXRhL3JhdyIsIHBhdHRlcm4gPSAiYW1zX2plbmFfcmVzdWx0cyIsIGZ1bGwubmFtZXMgPSBUUlVFKQphbXNfcmVzdWx0c19scyA8LSBsYXBwbHkoc2VxX2Fsb25nKGFtc19qZW5hX3Jlc3VsdHNfZGlycyksIGZ1bmN0aW9uKGkpIHsKICByZWFkX2plbmFfYW1zX3Jlc3VsdHMoYW1zX2plbmFfcmVzdWx0c19kaXJzW2ldKQp9KQpuYW1lcyhhbXNfcmVzdWx0c19scykgPC0gbGlzdC5maWxlcygiLi4vZGF0YS9yYXciLCBwYXR0ZXJuID0gImFtc19qZW5hX3Jlc3VsdHMiKQoKIyAjIDEzQwojICMgaWRlbnRpZnkgc3ViZGlyZWN0b3JpZXMgaW4gJ3JhdycgZGlyZWN0b3J5IHdpdGggImlzb19qZW5hIiBpbiBuYW1lCiMgaXNvX2plbmFfcmVzdWx0c19kaXJzIDwtIGxpc3QuZmlsZXMoIi4uL2RhdGEvcmF3IiwgcGF0dGVybiA9ICJpc29famVuYV9yZXN1bHRzIiwgZnVsbC5uYW1lcyA9IFRSVUUpCiMgaXNvX3Jlc3VsdHNfbHMgPC0gbGFwcGx5KHNlcV9hbG9uZyhpc29famVuYV9yZXN1bHRzX2RpcnMpLCBmdW5jdGlvbihpKSB7CiMgICByZWFkX2plbmFfaXNvX3Jlc3VsdHMoaXNvX2plbmFfcmVzdWx0c19kaXJzW2ldKQojIH0pCiMgbmFtZXMoaXNvX3Jlc3VsdHNfbHMpIDwtIGxpc3QuZmlsZXMoIi4uL2RhdGEvcmF3IiwgcGF0dGVybiA9ICJpc29famVuYV9yZXN1bHRzIikKCiMgUmVhZCBpbiBDIGFuZCBOIGRhdGEKZWxtX3Jlc3VsdHNfZGlyIDwtIGxpc3QuZmlsZXMoIi4uL2RhdGEvcmF3IiwgcGF0dGVybiA9ICJlbG1famVuYV9yZXN1bHRzIiwgZnVsbC5uYW1lcyA9IFRSVUUpCmVsbV9yZXN1bHRzX2xzIDwtIGxhcHBseShzZXFfYWxvbmcoZWxtX3Jlc3VsdHNfZGlyKSwgZnVuY3Rpb24oaSkgewogIHJlYWRfamVuYV9lbG1fcmVzdWx0cyhlbG1fcmVzdWx0c19kaXJbaV0pCn0pCm5hbWVzKGVsbV9yZXN1bHRzX2xzKSA8LSBsaXN0LmZpbGVzKCIuLi9kYXRhL3JhdyIsIHBhdHRlcm4gPSAiZWxtX2plbmFfcmVzdWx0cyIpCmBgYAoKYGBge3IgZGF0YS10ZW1wbGF0ZX0KIyBDcmVhdGUgdGVtcGxhdGUgZm9yIGJ1bGsgc29pbCBkYXRhCnRlbXBsYXRlMTkuZnggPC0gZnVuY3Rpb24ocG0sIGVjbywgbmRlcHRoKSB7CiAgZGYgPC0gZGF0YS5mcmFtZShZZWFyID0gcmVwKDIwMTksIG5kZXB0aCAqIDMpLAogICAgICAgICAgICAgICAgICAgUE0gPSByZXAocG0sIG5kZXB0aCAqIDMpLAogICAgICAgICAgICAgICAgICAgRUNPID0gcmVwKGVjbywgbmRlcHRoICogMyksCiAgICAgICAgICAgICAgICAgICBwcm9fcmVwID0gcmVwKHNlcSgxLDMpLCBlYWNoID0gbmRlcHRoKSwKICAgICAgICAgICAgICAgICAgIGx5cl90b3AgPSByZXAoc2VxKDAsIChuZGVwdGgtMSkgKiAxMCwgYnkgPSAxMCksIDMpLAogICAgICAgICAgICAgICAgICAgbHlyX2JvdCA9IHJlcChzZXEoMTAsIChuZGVwdGgpICogMTAsIGJ5ID0gMTApLCAzKSkKICBkZiRwcm9fbmFtZSA8LSBwYXN0ZTAoZGYkUE0sIGRmJEVDTywgIl8iLCBkZiRwcm9fcmVwKQogIGRmJGx5cl9uYW1lIDwtIHBhc3RlMChkZiRwcm9fbmFtZSwgIl8iLCBkZiRseXJfdG9wLCAiLSIsIGRmJGx5cl9ib3QpCiAgcmV0dXJuKGRmKQp9CgojIENyZWF0ZSB0ZW1wbGF0ZSBmb3IgY29tcG9zaXRlIHNvaWwgZGF0YSAoaW5jdWJhdGlvbnMsIGRlbnNpdHkgZnJhY3Rpb25zLCBldGMuKQp0ZW1wbGF0ZTE5LmNvbXAuZnggPC0gZnVuY3Rpb24ocG0sIGVjbywgbmRlcHRoKSB7CiAgZGYgPC0gZGF0YS5mcmFtZShZZWFyID0gcmVwKDIwMTksIDMpLAogICAgICAgICAgICAgICAgICAgUE0gPSByZXAocG0sIDMpLAogICAgICAgICAgICAgICAgICAgRUNPID0gcmVwKGVjbywgMyksCiAgICAgICAgICAgICAgICAgICBseXJfdG9wID0gcmVwKHNlcSgwLCAobmRlcHRoLTEpICogMTAsIGJ5ID0gMTApKSwKICAgICAgICAgICAgICAgICAgIGx5cl9ib3QgPSByZXAoc2VxKDEwLCAobmRlcHRoKSAqIDEwLCBieSA9IDEwKSkpCiAgZGYkcHJvX25hbWUgPC0gcGFzdGUwKGRmJFBNLCBkZiRFQ08sICJfY29tcCIpCiAgZGYkbHlyX25hbWUgPC0gcGFzdGUwKGRmJHByb19uYW1lLCAiXyIsIGRmJGx5cl90b3AsICItIiwgZGYkbHlyX2JvdCkKICByZXR1cm4oZGYpCn0KCiMgdGVtcGxhdGVzIGZvciBidWxrIHNvaWwgZGF0YQojIEdScmYgCkdScmYgPC0gdGVtcGxhdGUxOS5meCgiR1IiLCAicmYiLCA3KQpHUnJmIDwtIGlmKGFueShHUnJmJGx5cl9uYW1lID09ICJHUnJmXzFfNjBfNzAiKSkgewogIEdScmYgPC0gR1JyZlstd2hpY2goR1JyZiRseXJfbmFtZSA9PSAiR1JyZl8xXzYwXzcwIiksIF0gIyBOQjogR1JyZl8xXzYwXzcwIGRvZXNuJ3QgZXhpc3QKfSBlbHNlIHsKICBHUnJmIDwtIEdScmYKfQojIEdSd2YKR1J3ZiA8LSB0ZW1wbGF0ZTE5LmZ4KCJHUiIsICJ3ZiIsIDkpCiMgR1JwcApHUnBwIDwtIHRlbXBsYXRlMTkuZngoIkdSIiwgInBwIiwgOCkKCiMgQU5yZiAKQU5yZiA8LSB0ZW1wbGF0ZTE5LmZ4KCJBTiIsICJyZiIsIDYpCiMgQU53ZgpBTndmIDwtIHRlbXBsYXRlMTkuZngoIkFOIiwgIndmIiwgNikKIyBBTnBwCkFOcHAgPC0gdGVtcGxhdGUxOS5meCgiQU4iLCAicHAiLCA4KQoKIyBCU3JmIApCU3JmIDwtIHRlbXBsYXRlMTkuZngoIkJTIiwgInJmIiwgOCkKQlNyZiA8LSBpZihhbnkoQlNyZiRseXJfbmFtZSA9PSAiR1JyZl8xXzYwXzcwIikpIHsKICBCU3JmIDwtIEJTcmZbLXdoaWNoKEJTcmYkbHlyX25hbWUgPT0gIkJTcmZfMV83MF84MCIpLCBdICMgTkI6IEJTcmZfMV83MF84MCBkb2Vzbid0IGV4aXN0Cn0gZWxzZSB7CiAgQlNyZiA8LSBCU3JmCn0gCiMgQlN3ZgpCU3dmIDwtIHRlbXBsYXRlMTkuZngoIkJTIiwgIndmIiwgNykKIyBCU3BwCkJTcHAgPC0gdGVtcGxhdGUxOS5meCgiQlMiLCAicHAiLCA4KQpCU3BwW0JTcHAkbHlyX2JvdCA9PSA4MCwgImx5cl9ib3QiXSA8LSA3NSAjIG9ubHkgc2FtcGxlZCB0byA3NWNtLCBub3QgODAKCnNyYS4yMDE5LmRmIDwtIHJiaW5kKEdScmYsIEdSd2YsIEdScHAsCiAgICAgICAgICAgICAgICAgICAgIEFOcmYsIEFOd2YsIEFOcHAsCiAgICAgICAgICAgICAgICAgICAgIEJTcmYsIEJTd2YsIEJTcHApCgojIHRlbXBsYXRlIGZvciAyMDE5IGluY3ViYXRpb24gZGF0YQpHUnJmX2luYyA8LSB0ZW1wbGF0ZTE5LmNvbXAuZngoIkdSIiwgInJmIiwgMykKR1J3Zl9pbmMgPC0gdGVtcGxhdGUxOS5jb21wLmZ4KCJHUiIsICJ3ZiIsIDMpCkdScHBfaW5jIDwtIHRlbXBsYXRlMTkuY29tcC5meCgiR1IiLCAicHAiLCAzKQoKQU5yZl9pbmMgPC0gdGVtcGxhdGUxOS5jb21wLmZ4KCJBTiIsICJyZiIsIDMpCkFOd2ZfaW5jIDwtIHRlbXBsYXRlMTkuY29tcC5meCgiQU4iLCAid2YiLCAzKQpBTnBwX2luYyA8LSB0ZW1wbGF0ZTE5LmNvbXAuZngoIkFOIiwgInBwIiwgMykKCkJTcmZfaW5jIDwtIHRlbXBsYXRlMTkuY29tcC5meCgiQlMiLCAicmYiLCAzKQpCU3dmX2luYyA8LSB0ZW1wbGF0ZTE5LmNvbXAuZngoIkJTIiwgIndmIiwgMykKQlNwcF9pbmMgPC0gdGVtcGxhdGUxOS5jb21wLmZ4KCJCUyIsICJwcCIsIDMpCgpzcmEuMjAxOS5pbmMuZGYgPC0gcmJpbmQoR1JyZl9pbmMsIEdSd2ZfaW5jLCBHUnBwX2luYywKICAgICAgICAgICAgICAgICAgICAgICAgIEFOcmZfaW5jLCBBTndmX2luYywgQU5wcF9pbmMsCiAgICAgICAgICAgICAgICAgICAgICAgICBCU3JmX2luYywgQlN3Zl9pbmMsIEJTcHBfaW5jKQoKIyAyMDAxIGJ1bGsgc29pbCB0ZW1wbGF0ZQpzcmEuMjAwMSA8LSB2ZWN0b3IobW9kZSA9ICJsaXN0IiwgbGVuZ3RoID0gbGVuZ3RoKHVuaXF1ZShzcmEuMjAxOS5kZiRwcm9fbmFtZSkpKQpuYW1lcyhzcmEuMjAwMSkgPC0gdW5pcXVlKHNyYS4yMDE5LmRmJHByb19uYW1lKQoKIyAyMDA5IGRhdGEgKGZyb20gQy4gUmFzbXVzc2VuKQpyYXMxOC5seXIgPC0gcmVhZC5jc3YoIi9Vc2Vycy9qZWZmL1IvMTRDb25zdHJhaW50L3Jhc18yMDE4LmNzdiIpCnJhczE4Lmx5ciRFQ08gPC0gZmFjdG9yKHJhczE4Lmx5ciRNQVNULCBsYWJlbHMgPSBjKCJyZiIsIndmIiwicHAiKSkKCiMgMjAxOSBidWxrIHNvaWwgdGVtcGxhdGUKc3JhLjIwMTkgPC0gc3JhLjIwMDEKCiMgMjAxOSBpbmMgdGVtcGxhdGUKc3JhLjIwMTkuaW5jIDwtIHZlY3Rvcihtb2RlID0gImxpc3QiLCBsZW5ndGggPSBsZW5ndGgodW5pcXVlKHNyYS4yMDE5LmluYy5kZiRwcm9fbmFtZSkpKQpuYW1lcyhzcmEuMjAxOS5pbmMpIDwtIHVuaXF1ZShzcmEuMjAxOS5pbmMuZGYkcHJvX25hbWUpCiMgY29waWVzIGZvciByZXBzIG9mIGluY3ViYXRpb25zCnNyYS4yMDE5LmluY18xIDwtIHNyYS4yMDE5LmluYwpzcmEuMjAxOS5pbmNfMiA8LSBzcmEuMjAxOS5pbmMKYGBgCgoqTWVyZ2UgdGVtcGxhdGVzIHdpdGggMTRDLCBDLCBhbmQgTiBkYXRhKgoKUmFkaW9jYXJib24gYW5hbHlzZXMgZm9yIHRoZSAyMDAxIHNhbXBsZXMgd2VyZSBub3QgcnVuIG9yaWdpbmFsbHksIGJ1dCB3ZXJlIGNvbXBsZXRlZCBvbiBhcmNoaXZlZCBzYW1wbGVzIGluIDIwMjAuCgpgYGB7ciBtZXJnZS1pc28tZGF0YS1TMDEtc29pbH0KIyBFeHRyYWN0IDE0QyBkYXRhIGZvciAyMDAxIHNhbXBsZXMKYW1zX3Jlc3VsdHNfbHNfUzAxIDwtIGFtc19yZXN1bHRzX2xzW2dyZXAoIlMwMSIsIG5hbWVzKGFtc19yZXN1bHRzX2xzKSldCmZvcihpIGluIHNlcV9hbG9uZyhzcmEuMjAwMSkpIHsKICBzcmEuMjAwMVtbaV1dIDwtIGxhcHBseShhbXNfcmVzdWx0c19sc19TMDEsIGZ1bmN0aW9uKGxzKSB7CiAgICBsYXBwbHkobHMsIGZ1bmN0aW9uKGRmKSB7CiAgICAgIGlmKGFueShncmVwbChuYW1lcyhzcmEuMjAwMSlbaV0sIGRmJFByb2JlKSkpIHsKICAgICAgIGRmW2dyZXAobmFtZXMoc3JhLjIwMDEpW2ldLCBkZiRQcm9iZSksIF0gCiAgICAgIH0KICAgIH0pCiAgfSkKICBzcmEuMjAwMVtbaV1dIDwtIEZpbHRlcihOZWdhdGUoaXMubnVsbCksIHVubGlzdChzcmEuMjAwMVtbaV1dLCByZWN1cnNpdmUgPSBGQUxTRSkpCn0Kc3JhLjIwMDEgPC0gYmluZF9yb3dzKHVubGlzdChzcmEuMjAwMSwgcmVjdXJzaXZlID0gRkFMU0UpKQoKIyBjcmVhdGUgSUQgZmllbGQsIHRyaW0gZGYsIGFuZCBhZGQgZGVwdGhzCnNyYS4yMDAxJElEIDwtIHVubGlzdChzdHJzcGxpdChzcmEuMjAwMSRQcm9iZSwgIl9TaWVycmEgTmV2YWRhXzIwMDEiKSkKc3JhLjIwMDEgPC0gc3JhLjIwMDFbICwgYygiSUQiLCAiRjE0QyIsICJlcnIiLCAi4oiGMTRDLijigLApIiwgImVyci4o4oCwKSIpXQpuYW1lcyhzcmEuMjAwMSkgPC0gYygiSUQiLCAiZm0iLCAiZm1fZXJyIiwgImQxNGMiLCAiZDE0Y19lcnIiKQpzcmEuMjAwMSRseXJfdG9wIDwtIGFzLm51bWVyaWMoaWZlbHNlKHN1YnN0cihzcmEuMjAwMSRJRCwgOSwgOSkgPT0gIi0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnN0cihzcmEuMjAwMSRJRCwgOCwgOCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vic3RyKHNyYS4yMDAxJElELCA4LCA5KSkpCnNyYS4yMDAxJGx5cl9ib3QgPC0gYXMubnVtZXJpYyhpZmVsc2Uoc3Vic3RyKHNyYS4yMDAxJElELCA5LCA5KSA9PSAiLSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YnN0cihzcmEuMjAwMSRJRCwgMTAsIG5jaGFyKHNyYS4yMDAxJElEKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Vic3RyKHNyYS4yMDAxJElELCAxMSwgbmNoYXIoc3JhLjIwMDEkSUQpKSkpCnNyYS4yMDAxJHByb19yZXAgPC0gc3Vic3RyKHNyYS4yMDAxJElELCA2LCA2KQpzcmEuMjAwMSRQTSA8LSBmYWN0b3Ioc3Vic3RyKHNyYS4yMDAxJElELCAxLCAyKSkKc3JhLjIwMDEkRUNPIDwtIGZhY3RvcihzdWJzdHIoc3JhLjIwMDEkSUQsIDMsIDQpLCBsZXZlbHMgPSBjKCJwcCIsICJ3ZiIsICJyZiIpKQpzcmEuMjAwMSRwcm9fbmFtZSA8LSBzdWJzdHIoc3JhLjIwMDEkSUQsIDEsIDYpCnNyYS4yMDAxJFBNZWNvIDwtIHN1YnN0cihzcmEuMjAwMSRJRCwgMSwgNCkKCiMgcmVtb3ZlIG91dGxpZXIgQU5wcCBzYW1wbGUKc3JhLjIwMDEgPC0gc3JhLjIwMDFbLXdoaWNoKHNyYS4yMDAxJElEID09ICJBTnBwXzNfNi0xMyIpLCBdCgojIG1ha2UgbGlzdCBieSBQTWVjbwpzcmEuMjAwMS5scyA8LSBzcGxpdChzcmEuMjAwMSwgc3JhLjIwMDEkUE1lY28pCmBgYAoKYGBge3IgbWVyZ2UtaXNvLWRhdGEtc29pbC1TMTl9CiMgRXh0cmFjdCAxNEMgZGF0YSBmb3IgMjAxOSBzYW1wbGVzCmFtc19yZXN1bHRzX2xzX1MxOSA8LSBhbXNfcmVzdWx0c19sc1tncmVwKCJzb2lsLVMxOSIsIG5hbWVzKGFtc19yZXN1bHRzX2xzKSldCmZvcihpIGluIHNlcV9hbG9uZyhzcmEuMjAxOSkpIHsKICBzcmEuMjAxOVtbaV1dIDwtIGxhcHBseShhbXNfcmVzdWx0c19sc19TMTksIGZ1bmN0aW9uKGxzKSB7CiAgICBsYXBwbHkobHMsIGZ1bmN0aW9uKGRmKSB7CiAgICAgIGlmKGFueShncmVwbChuYW1lcyhzcmEuMjAxOSlbaV0sIGRmJFByb2JlKSkpIHsKICAgICAgIGRmW2dyZXAobmFtZXMoc3JhLjIwMTkpW2ldLCBkZiRQcm9iZSksIF0gCiAgICAgIH0KICAgIH0pCiAgfSkKICBzcmEuMjAxOVtbaV1dIDwtIEZpbHRlcihOZWdhdGUoaXMubnVsbCksIHVubGlzdChzcmEuMjAxOVtbaV1dLCByZWN1cnNpdmUgPSBGQUxTRSkpCn0Kc3JhLjIwMTkgPC0gYmluZF9yb3dzKHVubGlzdChzcmEuMjAxOSwgcmVjdXJzaXZlID0gRkFMU0UpKQoKIyMgbWVyZ2Ugdy8gMjAxOSB0ZW1wbGF0ZQojIHJlbmFtZSBjb2xzIGluIEFNUyB0YWJsZXMKc3JhLjIwMTkgPC0gc3JhLjIwMTlbICwgYygiUHJvYmUiLCAiRjE0QyIsICJlcnIiLCAi4oiGMTRDLijigLApIiwgImVyci4o4oCwKSIpXQpuYW1lcyhzcmEuMjAxOSkgPC0gYygiSUQiLCAiZm0iLCAiZm1fZXJyIiwgImQxNGMiLCAiZDE0Y19lcnIiKQojIG1lcmdlCnNyYS4yMDE5LmxzIDwtIGxhcHBseShzcGxpdChzcmEuMjAxOS5kZiwgc3JhLjIwMTkuZGYkbHlyX25hbWUpLCBmdW5jdGlvbihkZikgewogIGRmIDwtIG1lcmdlKGRmLCBzcmEuMjAxOVtncmVwKGRmJGx5cl9uYW1lLCBzcmEuMjAxOSRJRCksIF0pCiAgZGYkSUQgPC0gTlVMTAogIGRmJFBNZWNvIDwtIHBhc3RlMChkZiRQTSwgZGYkRUNPKQogIHJldHVybihkZikKfSkKCiMgcmVzaGFwZSBsaXN0IGJ5IFBNZWNvCnNyYS4yMDE5LmxzIDwtIHNwbGl0KGJpbmRfcm93cyhzcmEuMjAxOS5scyksIGJpbmRfcm93cyhzcmEuMjAxOS5scylbWyJQTWVjbyJdXSkKYGBgCgpgYGB7ciBtZXJnZS1pc28tZGF0YS1jbzItUzE5fQojIEV4dHJhY3QgMTRDIGRhdGEgZm9yIDIwMTkgc2FtcGxlcwojIHJlcCAxIGRhdGEKYW1zX3Jlc3VsdHNfbHNfY28yX1MxOV8xIDwtIGFtc19yZXN1bHRzX2xzW2dyZXAoImNvMi1TMTktMSIsIG5hbWVzKGFtc19yZXN1bHRzX2xzKSldCmZvcihpIGluIHNlcV9hbG9uZyhzcmEuMjAxOS5pbmMpKSB7CiAgc3JhLjIwMTkuaW5jXzFbW2ldXSA8LSBsYXBwbHkoYW1zX3Jlc3VsdHNfbHNfY28yX1MxOV8xLCBmdW5jdGlvbihscykgewogICAgbGFwcGx5KGxzLCBmdW5jdGlvbihkZikgewogICAgICBpZihhbnkoZ3JlcGwobmFtZXMoc3JhLjIwMTkuaW5jKVtpXSwgZGYkUHJvYmUpKSkgewogICAgICAgZGZbZ3JlcChuYW1lcyhzcmEuMjAxOS5pbmMpW2ldLCBkZiRQcm9iZSksIF0gCiAgICAgIH0KICAgIH0pCiAgfSkKICBzcmEuMjAxOS5pbmNfMVtbaV1dIDwtIEZpbHRlcihOZWdhdGUoaXMubnVsbCksIHVubGlzdChzcmEuMjAxOS5pbmNfMVtbaV1dLCByZWN1cnNpdmUgPSBGQUxTRSkpCn0Kc3JhLjIwMTkuaW5jXzEgPC0gYmluZF9yb3dzKHVubGlzdChzcmEuMjAxOS5pbmNfMSwgcmVjdXJzaXZlID0gRkFMU0UpKQoKIyMgbWVyZ2Ugdy8gMjAxOSB0ZW1wbGF0ZQojIHJlbmFtZSBjb2xzIGluIEFNUyB0YWJsZXMKc3JhLjIwMTkuaW5jXzEgPC0gc3JhLjIwMTkuaW5jXzFbICwgYygiUHJvYmUiLCAiRjE0QyIsICJlcnIiLCAi4oiGMTRDLijigLApIiwgImVyci4o4oCwKSIpXQpuYW1lcyhzcmEuMjAxOS5pbmNfMSkgPC0gYygiSUQiLCAiZm0iLCAiZm1fZXJyIiwgImQxNGMiLCAiZDE0Y19lcnIiKQojIG1lcmdlCnNyYS4yMDE5LmluYy5sc18xIDwtIGxhcHBseShzcGxpdChzcmEuMjAxOS5pbmMuZGYsIHNyYS4yMDE5LmluYy5kZiRseXJfbmFtZSksIGZ1bmN0aW9uKGRmKSB7CiAgZGYgPC0gbWVyZ2UoZGYsIHNyYS4yMDE5LmluY18xW2dyZXAoZGYkbHlyX25hbWUsIHNyYS4yMDE5LmluY18xJElEKSwgXSkKICBkZiRJRCA8LSBOVUxMCiAgZGYkUE1lY28gPC0gcGFzdGUwKGRmJFBNLCBkZiRFQ08pCiAgcmV0dXJuKGRmKQp9KQoKIyByZXNoYXBlIGxpc3QgYnkgUE1lY28Kc3JhLjIwMTkuaW5jLmxzXzEgPC0gc3BsaXQoYmluZF9yb3dzKHNyYS4yMDE5LmluYy5sc18xKSwgYmluZF9yb3dzKHNyYS4yMDE5LmluYy5sc18xKVtbIlBNZWNvIl1dKQpgYGAKCmBgYHtyIHBsb3QtMjAwMS1wcm9maWxlcywgaW5jbHVkZSA9IEZBTFNFfQpwcm8ucGxvdCA8LSBmdW5jdGlvbihkZiwgbWF4RGVwdGgsIG1pbjE0QywgcmVwKSB7CiAgZ2dwbG90KGRmLCBhZXMoZDE0YywgbHlyX2JvdCwgY29sb3IgPSBQTSwgc2hhcGUgPSBFQ08sIGdyb3VwID0gcmVwKSkgKwogICAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCkgKwogICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgKwogICAgZ2VvbV9wb2ludChzaXplID0gMykgKwogICAgZ2VvbV9wYXRoKCkgKwogICAgc2NhbGVfeV9yZXZlcnNlKGxpbWl0cyA9IGMobWF4RGVwdGgsIDApKSArCiAgICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzID0gYyhtaW4xNEMsIDE4MCkpICsKICAgIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gInBhcmVudCBtYXRlcmlhbCIsCiAgICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiQU4iID0gImFuZGVzaXRlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCUyIgPSAiYmFzYWx0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHUiIgPSAiZ3Jhbml0ZSIpLAogICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoIkFOIiA9ICJibHVlIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQlMiID0gInJlZCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdSIiA9ICJkYXJrZ3JheSIpKSArCiAgICBzY2FsZV9zaGFwZV9tYW51YWwobmFtZSA9ICJlY29zeXN0ZW0iLAogICAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoInBwIiA9IGV4cHJlc3Npb24oaXRhbGljKCJQLiBwb25kZXJvc2EiKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmYiID0gZXhwcmVzc2lvbihpdGFsaWMoIkEuIG1hZ25pZmljYSIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3ZiIgPSBleHByZXNzaW9uKGl0YWxpYygiQS4gY29uY29sb3IiKSkpLAogICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoInBwIiA9IDE1LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZiIgPSAxNiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid2YiID0gMTcpKSArCiAgICB4bGFiKGV4cHJlc3Npb24oRGVsdGEqJydeMTQqJ0MgKOKAsCknKSkgKwogICAgeWxhYigiRGVwdGggKGNtKSIpICsKICAgIHRoZW1lX2J3KCkgKwogICAgdGhlbWUocGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSkKfQoKIyBsYXBwbHkoc3JhLjIwMDEubHMsIGZ1bmN0aW9uKGRmKSBwcm8ucGxvdChkZiwgbWF4KGRmJGx5cl9ib3QpLCBtaW4oZGYkZDE0YyksIGRmJHByb19yZXApKQpgYGAKCmBgYHtyIHBsb3QtMjAxOS1wcm9maWxlcywgaW5jbHVkZSA9IEZBTFNFfQojIGxhcHBseShzcmEuMjAxOS5scywgZnVuY3Rpb24oZGYpIHByby5wbG90KGRmLCBtYXgoZGYkbHlyX2JvdCksIG1pbihkZiRkMTRjKSwgZGYkcHJvX3JlcCkpCmBgYAoKYGBge3IgcGxvdC0yMDE5LWNvMi1wcm9maWxlcywgaW5jbHVkZSA9IEZBTFNFfQojIGxhcHBseShzcmEuMjAxOS5pbmMubHNfMSwgZnVuY3Rpb24oZGYpIHByby5wbG90KGRmLCBtYXgoZGYkbHlyX2JvdCksIG1pbihkZiRkMTRjKSwgTkEpKQpgYGAKCiMjIDIwMDEgbWVhbiByYWRpb2NhcmJvbiBwcm9maWxlcwpgYGB7ciBwbG90LTIwMDEtYXZnLXByb2ZpbGVzfQojIGZtIGFuZCBkMTRjIGNvbnZlcnNpb24gZnVuY3Rpb25zCmxhbWJkYSA8LSAxLzgyNjcgIyA9IDEvKHRydWUgbWVhbiBsaWZlIG9mIDE0QykKY2FsY19mbSA8LSBmdW5jdGlvbihkMTRjLCBvYnNfZGF0ZV95KSB7CiAgKChkMTRjLzEwMDApICsgMSkvZXhwKGxhbWJkYSAqICgxOTUwIC0gb2JzX2RhdGVfeSkpCn0KY2FsY18xNGMgPC0gZnVuY3Rpb24oZm0sIG9ic19kYXRlX3kpIHsKICAoZm0gKiBleHAobGFtYmRhICogKDE5NTAgLSBvYnNfZGF0ZV95KSkgLSAxKSAqIDEwMDAKfQoKIyBjYWxjIGF0bSBpbiAyMDAxLCAyMDA5LCAyMDE5CkRhdG0gPC0gcmJpbmQoZ3JhdmVuLCBmdXR1cmUxNEMpCmF0bS5kMTQuMjAwMSA8LSBEYXRtW0RhdG0kRGF0ZSA9PSAyMDAxLjUsICJOSGMxNCJdCmF0bS5mbS4yMDAxIDwtIGNhbGNfZm0oYXRtLmQxNC4yMDAxLCAyMDAxKQphdG0uZDE0LjIwMDkgPC0gRGF0bVtEYXRtJERhdGUgPT0gMjAwOS41LCAiTkhjMTQiXQphdG0uZm0uMjAwOSA8LSBjYWxjX2ZtKGF0bS5kMTQuMjAwOSwgMjAwOSkKYXRtLmQxNC4yMDE5IDwtIERhdG1bRGF0bSREYXRlID09IDIwMTkuNSwgIk5IYzE0Il0KYXRtLmZtLjIwMTkgPC0gY2FsY19mbShhdG0uZDE0LjIwMTksIDIwMTkpCgojIGNvbWJpbmUgcmVwcwpzcmEuMjAwMS5zdW0ubHMgIDwtIGxhcHBseShzcmEuMjAwMS5scywgZnVuY3Rpb24oZGYpIHsKICBkZiA8LSBkYXRhLmZyYW1lKGRmICU+JQogICAgICAgICAgICAgICAgICAgICBmaWx0ZXIobHlyX2JvdCA8PSA0MCkgJT4lCiAgICAgICAgICAgICAgICAgICAgIG11dGF0ZShseXJfdG9wX2NoID0gYXMuY2hhcmFjdGVyKGx5cl90b3ApLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbHlyX2JvdF9jaCA9IGFzLmNoYXJhY3RlcihseXJfYm90KSkgJT4lCiAgICAgICAgICAgICAgICAgICAgIHNlbGVjdChQTSwgRUNPLCBQTWVjbywgZm0sIGQxNGMsIGx5cl90b3BfY2gsIGx5cl9ib3RfY2gpICU+JQogICAgICAgICAgICAgICAgICAgICBncm91cF9ieShQTSwgRUNPLCBQTWVjbywgbHlyX3RvcF9jaCwgbHlyX2JvdF9jaCkgJT4lCiAgICAgICAgICAgICAgICAgICAgIHN1bW1hcml6ZV9hbGwobGlzdChtZWFuID0gbWVhbiwgc2QgPSBzZCksIG5hLnJtID0gVFJVRSkpCiAgbmFtZXMoZGYpIDwtIGMoIlBNIiwgIkVDTyIsICJQTWVjbyIsICJseXJfdG9wIiwgImx5cl9ib3QiLCAiZm0iLCAiZDE0YyIsICJmbV9zZCIsICJkMTRjX3NkIikKICBkZiRseXJfdG9wIDwtIGFzLm51bWVyaWMoZGYkbHlyX3RvcCkKICBkZiRseXJfYm90IDwtIGFzLm51bWVyaWMoZGYkbHlyX2JvdCkKICByZXR1cm4oZGYpCn0pCnNyYS4wMS5zdW0gPC0gYmluZF9yb3dzKHNyYS4yMDAxLnN1bS5scykKc3JhLjAxLnN1bSA8LSBzcmEuMDEuc3VtW29yZGVyKHNyYS4wMS5zdW0kbHlyX2JvdCksIF0KCnNyYS4wMS5zdW0gPC0gc3JhLjAxLnN1bSAlPiUKICBtdXRhdGUoZDE0Y191ID0gZDE0YyArIGQxNGNfc2QsCiAgICAgICAgIGQxNGNfbCA9IGQxNGMgLSBkMTRjX3NkLAogICAgICAgICBlY28gPSBmYWN0b3IoaWZlbHNlKEVDTyA9PSAicHAiLCAid2FybSIsCiAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoRUNPID09ICJ3ZiIsICJjb29sIiwgImNvbGQiKSksCiAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJ3YXJtIiwgImNvb2wiLCAiY29sZCIpKSwKICAgICAgICAgcG0gPSBpZmVsc2UoUE0gPT0gIkFOIiwgImFuZGVzaXRlIiwKICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKFBNID09ICJCUyIsICJiYXNhbHQiLCAiZ3Jhbml0ZSIpKSkKCiMgcGxvdApmaWcubiA8LSAxCnNyYS4wMS5zdW0gJT4lCiAgZ2dwbG90KC4sIGFlcyhkMTRjLCBseXJfYm90LCBjb2xvciA9IHBtLCBzaGFwZSA9IGVjbywgZ3JvdXAgPSBQTWVjbykpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBhdG0uZDE0LjIwMDEpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArCiAgZ2VvbV9wb2ludChzaXplID0gMykgKwogIGdlb21fZXJyb3JiYXJoKAogICAgYWVzKHhtaW4gPSBkMTRjX2wsIAogICAgICAgIHhtYXggPSBkMTRjX3UsCiAgICAgICAgY29sb3IgPSBwbSksIAogICAgaGVpZ2h0ID0gMS41KSArCiAgZ2VvbV9wYXRoKCkgKwogIHNjYWxlX3lfcmV2ZXJzZShsaW1pdHMgPSBjKDQwLCAwKSkgKwogIHNjYWxlX3hfY29udGludW91cyhsaW1pdHMgPSBjKC0xMDAsIDE4MCkpICsgICAgCiAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWUgPSAicGFyZW50IG1hdGVyaWFsIiwKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygiYW5kZXNpdGUiID0gImJsdWUiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmFzYWx0IiA9ICJyZWQiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ3Jhbml0ZSIgPSAiZGFya2dyYXkiKSkgKwogIHNjYWxlX3NoYXBlX21hbnVhbChuYW1lID0gImVjb3N5c3RlbSIsCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoIndhcm0iID0gMTUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb29sIiA9IDE2LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29sZCIgPSAxNykpICsKICB4bGFiKGV4cHJlc3Npb24oRGVsdGEqJydeMTQqJ0MgKOKAsCknKSkgKwogIHlsYWIoIkRlcHRoIChjbSkiKSArCiAgZmFjZXRfZ3JpZChyb3dzID0gdmFycyhlY28pLCBjb2xzID0gdmFycyhwbSkpICsKICB0aGVtZV9idygpICsKICB0aGVtZShwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpKQpgYGAKPioqRmlnLiBgciB7ZmlnLm59YC4gTWVhbiBwcm9maWxlICRcRGVsdGEkXjE0XkMgZm9yIDIwMDEgc2FtcGxlcyoqCgo+KkNhcHRpb246KiBNZWFuICRcRGVsdGEkXjE0XkMgYnkgZGVwdGggZm9yIGVhY2ggc2l0ZSBpbiAyMDAxLiBFcnJvciBiYXJzIHNob3cgwrExIHN0YW5kYXJkIGRldmlhdGlvbiwgc29saWQgdmVydGljYWwgbGluZSBzaG93cyAkXERlbHRhJF4xNF5DIG9mIHRoZSBhdG1vc3BoZXJlIGluIHRoZSB5ZWFyIG9mIHNhbXBsaW5nLgoKIyMgMjAwOSByYWRpb2NhcmJvbiBwcm9maWxlcwpgYGB7ciBwbG90LTIwMDktcHJvZmlsZXN9CiMgYWRkIFBNZWNvIGNvbApyYXMxOC5seXIkRUNPIDwtIGZhY3RvcihyYXMxOC5seXIkTUFTVCwgbGFiZWxzID0gYygicmYiLCJ3ZiIsInBwIikpCnJhczE4Lmx5ciRQTWVjbyA8LSBwYXN0ZTAocmFzMTgubHlyJFBNLCByYXMxOC5seXIkRUNPKQoKc3JhLjA5LnN1bSA8LSByYXMxOC5seXIgJT4lCiAgbXV0YXRlKGVjbyA9IGZhY3RvcihpZmVsc2UoRUNPID09ICJwcCIsICJ3YXJtIiwKICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShFQ08gPT0gIndmIiwgImNvb2wiLCAiY29sZCIpKSwKICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIndhcm0iLCAiY29vbCIsICJjb2xkIikpLAogICAgICAgICBwbSA9IGlmZWxzZShQTSA9PSAiQU4iLCAiYW5kZXNpdGUiLAogICAgICAgICAgICAgICAgICAgICBpZmVsc2UoUE0gPT0gIkJTIiwgImJhc2FsdCIsICJncmFuaXRlIikpKQoKZmlnLm4gPC0gZmlnLm4gKyAxCnNyYS4wOS5zdW0gJT4lCiAgZ2dwbG90KC4sIGFlcyhseXJfMTRjLCBseXJfYm90LCBjb2xvciA9IHBtLCBzaGFwZSA9IGVjbywgZ3JvdXAgPSBQTWVjbykpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBhdG0uZDE0LjIwMDkpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArCiAgZ2VvbV9wb2ludChzaXplID0gMykgKwogIGdlb21fcGF0aChsaW5ldHlwZSA9ICJkYXNoZWQiKSArCiAgc2NhbGVfeV9yZXZlcnNlKCkgKwogIHNjYWxlX3hfY29udGludW91cyhsaW1pdHMgPSBjKC0xMDAsIDE4MCkpICsgICAgCiAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWUgPSAicGFyZW50IG1hdGVyaWFsIiwKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygiYW5kZXNpdGUiID0gImJsdWUiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmFzYWx0IiA9ICJyZWQiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ3Jhbml0ZSIgPSAiZGFya2dyYXkiKSkgKwogIHNjYWxlX3NoYXBlX21hbnVhbChuYW1lID0gImVjb3N5c3RlbSIsCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoIndhcm0iID0gMCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvb2wiID0gMSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbGQiID0gMikpICsKICB4bGFiKGV4cHJlc3Npb24oRGVsdGEqJydeMTQqJ0MgKOKAsCknKSkgKwogIHlsYWIoIkRlcHRoIChjbSkiKSArCiAgZmFjZXRfZ3JpZChyb3dzID0gdmFycyhlY28pLCBjb2xzID0gdmFycyhwbSkpICsKICB0aGVtZV9idygpICsKICB0aGVtZShwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpKQpgYGAKPioqRmlnLiBgciB7ZmlnLm59YC4gUHJvZmlsZSAkXERlbHRhJF4xNF5DIGZvciAyMDA5IHNhbXBsZXMqKgoKPipDYXB0aW9uOiogUHJvZmlsZSAkXERlbHRhJF4xNF5DIGJ5IGRlcHRoIGZvciBlYWNoIHNpdGUgaW4gMjAwOS4gU29saWQgdmVydGljYWwgbGluZSBzaG93cyAkXERlbHRhJF4xNF5DIG9mIHRoZSBhdG1vc3BoZXJlIGluIHRoZSB5ZWFyIG9mIHNhbXBsaW5nLiBFcnJvciBiYXJzIG5vdCBzaG93biBhcyBvbmx5IGEgc2luZ2xlIHJlcGxpY2F0ZSBwcm9maWxlIHdhcyBhbmFseXplZCBwZXIgc2l0ZS4KCiMjIDIwMTkgbWVhbiByYWRpb2NhcmJvbiBwcm9maWxlcwpgYGB7ciBwbG90LTIwMTktYXZnLXByb2ZpbGVzfQojIGNvbWJpbmUgcmVwcwpzcmEuMjAxOS5zdW0ubHMgIDwtIGxhcHBseShzcmEuMjAxOS5scywgZnVuY3Rpb24oZGYpIHsKICBkZiA8LSBkYXRhLmZyYW1lKGRmICU+JQogICAgICAgICAgICAgICAgICAgICBtdXRhdGUobHlyX3RvcF9jaCA9IGFzLmNoYXJhY3RlcihseXJfdG9wKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGx5cl9ib3RfY2ggPSBhcy5jaGFyYWN0ZXIobHlyX2JvdCkpICU+JQogICAgICAgICAgICAgICAgICAgICBzZWxlY3QoUE0sIEVDTywgUE1lY28sIGZtLCBkMTRjLCBseXJfdG9wX2NoLCBseXJfYm90X2NoKSAlPiUKICAgICAgICAgICAgICAgICAgICAgZ3JvdXBfYnkoUE0sIEVDTywgUE1lY28sIGx5cl90b3BfY2gsIGx5cl9ib3RfY2gpICU+JQogICAgICAgICAgICAgICAgICAgICBzdW1tYXJpemVfYWxsKGxpc3QobWVhbiA9IG1lYW4sIHNkID0gc2QpLCBuYS5ybSA9IFRSVUUpKQogIG5hbWVzKGRmKSA8LSBjKCJQTSIsICJFQ08iLCAiUE1lY28iLCAibHlyX3RvcCIsICJseXJfYm90IiwgImZtIiwgImQxNGMiLCAiZm1fc2QiLCAiZDE0Y19zZCIpCiAgZGYkbHlyX3RvcCA8LSBhcy5udW1lcmljKGRmJGx5cl90b3ApCiAgZGYkbHlyX2JvdCA8LSBhcy5udW1lcmljKGRmJGx5cl9ib3QpCiAgcmV0dXJuKGRmKQp9KQpzcmEuMTkuc3VtIDwtIGJpbmRfcm93cyhzcmEuMjAxOS5zdW0ubHMpCgpzcmEuMTkuc3VtIDwtIHNyYS4xOS5zdW0gJT4lCiAgbXV0YXRlKGQxNGNfdSA9IGQxNGMgKyBkMTRjX3NkLAogICAgICAgICBkMTRjX2wgPSBkMTRjIC0gZDE0Y19zZCwKICAgICAgICAgZWNvID0gZmFjdG9yKGlmZWxzZShFQ08gPT0gInBwIiwgIndhcm0iLAogICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKEVDTyA9PSAid2YiLCAiY29vbCIsICJjb2xkIikpLAogICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygid2FybSIsICJjb29sIiwgImNvbGQiKSksCiAgICAgICAgIHBtID0gaWZlbHNlKFBNID09ICJBTiIsICJhbmRlc2l0ZSIsCiAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShQTSA9PSAiQlMiLCAiYmFzYWx0IiwgImdyYW5pdGUiKSkpIAoKIyBwbG90CmZpZy5uIDwtIGZpZy5uICsgMQpzcmEuMTkuc3VtICU+JQogIGdncGxvdCguLCBhZXMoZDE0YywgbHlyX2JvdCwgY29sb3IgPSBwbSwgc2hhcGUgPSBlY28sIGdyb3VwID0gUE1lY28pKSArCiAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gYXRtLmQxNC4yMDE5KSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgKwogIGdlb21fcG9pbnQoc2l6ZSA9IDIuNykgKwogIGdlb21fZXJyb3JiYXJoKAogICAgYWVzKHhtaW4gPSBkMTRjX2wsIAogICAgICAgIHhtYXggPSBkMTRjX3UsCiAgICAgICAgY29sb3IgPSBwbSksIAogICAgaGVpZ2h0ID0gMS41KSArCiAgZ2VvbV9wYXRoKCkgKwogIHNjYWxlX3lfcmV2ZXJzZShsaW1pdHMgPSBjKG1heChzcmEuMTkuc3VtJGx5cl9ib3QpLCAwKSkgKwogIHNjYWxlX3hfY29udGludW91cyhsaW1pdHMgPSBjKG1pbihzcmEuMTkuc3VtJGQxNGMpLCAxODApKSArICAgIAogIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gInBhcmVudCBtYXRlcmlhbCIsCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoImFuZGVzaXRlIiA9ICJibHVlIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJhc2FsdCIgPSAicmVkIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdyYW5pdGUiID0gImRhcmtncmF5IikpICsKICBzY2FsZV9zaGFwZV9tYW51YWwobmFtZSA9ICJlY29zeXN0ZW0iLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJ3YXJtIiA9IDE1LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29vbCIgPSAxNiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbGQiID0gMTcpKSArCiAgeGxhYihleHByZXNzaW9uKERlbHRhKicnXjE0KidDICjigLApJykpICsKICB5bGFiKCJEZXB0aCAoY20pIikgKwogIGZhY2V0X2dyaWQocm93cyA9IHZhcnMoZWNvKSwgY29scyA9IHZhcnMocG0pKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSkKYGBgCj4qKkZpZy4gYHIge2ZpZy5ufWAuIE1lYW4gcHJvZmlsZSAkXERlbHRhJF4xNF5DIGZvciAyMDE5IHNhbXBsZXMqKgoKPipDYXB0aW9uOiogTWVhbiAkXERlbHRhJF4xNF5DIGJ5IGRlcHRoIGZvciBlYWNoIHNpdGUgaW4gMjAxOS4gRXJyb3IgYmFycyBzaG93IMKxMSBzdGFuZGFyZCBkZXZpYXRpb24sIHNvbGlkIHZlcnRpY2FsIGxpbmUgc2hvd3MgJFxEZWx0YSReMTReQyBvZiB0aGUgYXRtb3NwaGVyZSBpbiB0aGUgeWVhciBvZiBzYW1wbGluZy4KCiMjIENoYW5nZSBpbiAkXERlbHRhJF4xNF5DIG92ZXIgdGltZSBiZXR3ZWVuIDIwMDEgYW5kIDIwMTkgCgpgYGB7ciBwbG90LWFsbC1hdmd9CiMgY29tYmluZSAnMDEgYW5kICcxOSBkYXRhIGZvciBwbG90dGluZwpzcmEuMDEuc3VtJFllYXIgPC0gMjAwMQpzcmEuMTkuc3VtJFllYXIgPC0gMjAxOQoKc3JhLmFsbCA8LSByYmluZChzcmEuMDEuc3VtLCBzcmEuMTkuc3VtKQpzcmEuYWxsJFllYXIgPC0gYXMuZmFjdG9yKHNyYS5hbGwkWWVhcikKCmZpZy5uIDwtIGZpZy5uICsgMQpzcmEuYWxsICU+JQogIG11dGF0ZShQTWVjb195ZWFyID0gcGFzdGUwKFBNZWNvLCBZZWFyKSwKICAgICAgICAgZWNvWWVhciA9IHBhc3RlMChFQ08sIFllYXIpLAogICAgICAgICBlY29ZZWFyMiA9IGlmZWxzZShlY29ZZWFyID09ICJwcDIwMDEiLCAid2FybSAoMjAwMSkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZWNvWWVhciA9PSAicHAyMDE5IiwgIndhcm0gKDIwMTkpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShlY29ZZWFyID09ICJ3ZjIwMDEiLCAiY29vbCAoMjAwMSkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShlY29ZZWFyID09ICJ3ZjIwMTkiLCAiY29vbCAoMjAxOSkiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoZWNvWWVhciA9PSAicmYyMDAxIiwgImNvbGQgKDIwMDEpIiwgImNvbGQgKDIwMTkpIikpKSkpKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKGQxNGMsIGx5cl9ib3QsIGNvbG9yID0gcG0sIHNoYXBlID0gZWNvWWVhcjIsIGdyb3VwID0gUE1lY29feWVhcikpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBhdG0uZDE0LjIwMDEpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBhdG0uZDE0LjIwMTksIGxpbmV0eXBlID0gImRhc2hlZCIpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArCiAgZ2VvbV9wb2ludChzaXplID0gMykgKwogIGdlb21fZXJyb3JiYXJoKAogICAgYWVzKHhtaW4gPSBkMTRjX2wsIAogICAgICAgIHhtYXggPSBkMTRjX3UsCiAgICAgICAgY29sb3IgPSBwbSksIAogICAgaGVpZ2h0ID0gMS41KSArCiAgZ2VvbV9wYXRoKGFlcyhsaW5ldHlwZSA9IFllYXIpKSArCiAgc2NhbGVfeV9yZXZlcnNlKGxpbWl0cyA9IGMoNDEsIDApKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWUgPSAicGFyZW50IG1hdGVyaWFsIiwKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygiYW5kZXNpdGUiID0gImJsdWUiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmFzYWx0IiA9ICJyZWQiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ3Jhbml0ZSIgPSAiZGFya2dyYXkiKSkgKwogIHNjYWxlX3NoYXBlX21hbnVhbChuYW1lID0gIkVjb3N5c3RlbSAoeWVhcikiLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJ3YXJtICgyMDAxKSIgPSAxNSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvb2wgKDIwMDEpIiA9IDE2LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29sZCAoMjAwMSkiID0gMTcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndhcm0gKDIwMTkpIiA9IDAsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb29sICgyMDE5KSIgPSAxLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29sZCAoMjAxOSkiID0gMikpICsKICB4bGFiKGV4cHJlc3Npb24oRGVsdGEqJydeMTQqJ0MgKOKAsCknKSkgKwogIHlsYWIoIkRlcHRoIChjbSkiKSArCiAgZmFjZXRfZ3JpZChyb3dzID0gdmFycyhlY28pLCBjb2xzID0gdmFycyhwbSkpICsKICB0aGVtZV9idygpICsKICB0aGVtZShwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpKQpgYGAKPioqRmlnLiBgciB7ZmlnLm59YC4gTWVhbiBwcm9maWxlICRcRGVsdGEkXjE0XkMgZm9yIDIwMDEgYW5kIDIwMTkgc2FtcGxlcyoqCgo+KkNhcHRpb246KiBNZWFuICRcRGVsdGEkXjE0XkMgYnkgZGVwdGggZm9yIGVhY2ggc2l0ZSBpbiAyMDAxIGFuZCAyMDE5LiBFcnJvciBiYXJzIHNob3cgwrExIHN0YW5kYXJkIGRldmlhdGlvbi4gVmVydGljYWwgbGluZXMgc2hvdyAkXERlbHRhJF4xNF5DIG9mIHRoZSBhdG1vc3BoZXJlIGluIDIwMDEgKHNvbGlkKSBhbmQgMjAxOSAoZGFzaGVkKS4KCiMjIEluY3ViYXRpb24gJFxEZWx0YSReMTReQy1DT34yfiBmb3IgMjAxOSBidWxrIHNvaWxzCgpgYGB7ciBwbG90LWluYy1kMTRjfQpzcmEuMjAxOS5pbmMuZGZfMSA8LSBiaW5kX3Jvd3Moc3JhLjIwMTkuaW5jLmxzXzEpCgpmaWcubiA8LSBmaWcubiArIDEKc3JhLjIwMTkuaW5jLmRmXzEgJT4lCiAgbXV0YXRlKGQxNGMgPSByZXBsYWNlKGQxNGMsIHdoaWNoKGQxNGMgPCAtMzAwKSwgTkEpLCAjIHJlbW92ZSBHUnJmIDEwLTIwIHBvaW50CiAgICAgICAgIGVjbyA9IGZhY3RvcihpZmVsc2UoRUNPID09ICJwcCIsICJ3YXJtIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoRUNPID09ICJ3ZiIsICJjb29sIiwgImNvbGQiKSksCiAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJ3YXJtIiwgImNvb2wiLCAiY29sZCIpKSwKICAgICAgICAgcG0gPSBpZmVsc2UoUE0gPT0gIkFOIiwgImFuZGVzaXRlIiwKICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKFBNID09ICJCUyIsICJiYXNhbHQiLCAiZ3Jhbml0ZSIpKSkgJT4lCiAgZ2dwbG90KC4sIGFlcyhkMTRjLCBseXJfYm90LCBjb2xvciA9IHBtLCBzaGFwZSA9IEVDTykpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgKwogIGdlb21fcG9pbnQoc2l6ZSA9IDMpICsKICAjIGdlb21fZXJyb3JiYXJoKAogICMgICBhZXMoeG1pbiA9IGQxNGNfbCwgCiAgIyAgICAgICB4bWF4ID0gZDE0Y191LAogICMgICAgICAgY29sb3IgPSBwbSksIAogICMgICBoZWlnaHQgPSAxLjUpICsKICBnZW9tX3BhdGgobGluZXR5cGUgPSAiZGFzaGVkIikgKwogIHNjYWxlX3lfcmV2ZXJzZSgpICsKICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICJQYXJlbnQgbWF0ZXJpYWwiLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJhbmRlc2l0ZSIgPSAiYmx1ZSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYXNhbHQiID0gInJlZCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJncmFuaXRlIiA9ICJkYXJrZ3JheSIpKSArCiAgc2NhbGVfc2hhcGVfbWFudWFsKG5hbWUgPSAiRWNvc3lzdGVtIiwKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygicHAiID0gMCwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndmIiA9IDEsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZiIgPSAyKSwKICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygicHAiID0gIndhcm0iLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid2YiID0gImNvb2wiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmYiID0gImNvbGQiKSkgKwogIHhsYWIoZXhwcmVzc2lvbignSW5jdWJhdGlvbiAnKkRlbHRhKicnXjE0KidDLUNPJ1syXSonICjigLApJykpICsKICB5bGFiKCJEZXB0aCAoY20pIikgKwogIGZhY2V0X2dyaWQocm93cyA9IHZhcnMoRUNPKSkgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpCmBgYAo+KipGaWcuIGByIHtmaWcubn1gLiBSZXAgMSAkXERlbHRhJF4xNF5DLUNPfjJ+IG9mIDIwMTkgYnVsayBzb2lsIGluY3ViYXRpb25zKioKCj4qQ2FwdGlvbjoqICRcRGVsdGEkXjE0XkNPfjJ+IGJ5IGRlcHRoIGZvciBlYWNoIHNpdGUgaW4gMjAxOS4gKFN0aWxsIHdhaXRpbmcgZm9yIGRhdGEgZnJvbSBsYWJvcmF0b3J5IGR1cGxpY2F0ZXMpLiBOb3RlIHRoYXQgdGhlIDEwLTIwIGNtIGluY3JlbWVudCBzYW1wbGUgZnJvbSB0aGUgY29sZCBncmFuaXRlIHNpdGUgYXBwZWFycyB0byBoYXZlIGJlZW4gY29udGFtaW5hdGVkOiAkXERlbHRhJF4xNF5DLUNPfjJ+ID0gYHIge3NyYS4yMDE5LmluYy5kZl8xW3NyYS4yMDE5LmluYy5kZl8xJFBNZWNvID09ICJHUnJmIiAmIHNyYS4yMDE5LmluYy5kZl8xJGx5cl9ib3QgPT0gMjAsICJkMTRjIl19YC4KCiMjIEluY3ViYXRpb24gdnMuIGJ1bGsgc29pbCAkXERlbHRhJF4xNF5DCgpgYGB7ciBwbG90LWluYy1idWxrLWQxNGN9CiMgYmluZCByb3dzIG9mIGluYyBsaXN0CnNyYS4xOS5pbmMgPC0gc3JhLjIwMTkuaW5jLmRmXzFbICwgIShuYW1lcyhzcmEuMjAxOS5pbmMuZGZfMSkgJWluJSBjKCJmbSIsICJmbV9lcnIiKSldCnNyYS4xOS5pbmMkVHlwZSA8LSAiaW5jIgpzcmEuMTkuaW5jJGQxNGNfbCA8LSBOQQpzcmEuMTkuaW5jJGQxNGNfdSA8LSBOQQoKIyByYmluZCBidWxrIGRhdGEKc3JhLjE5LmJ1bGsgPC0gc3JhLjE5LmluYwpzcmEuMTkuYnVsa1sgLCBjKCJkMTRjIiwgImQxNGNfbCIsICJkMTRjX3UiKV0gPC0gc3JhLjE5LnN1bVt3aGljaChzcmEuMTkuc3VtJGx5cl9ib3QgPCAzMSksIGMoImQxNGMiLCAiZDE0Y19sIiwgImQxNGNfdSIpXQpzcmEuMTkuYnVsayRUeXBlIDwtICJidWxrIgpzcmEuMTkuaW5jLmJsayA8LSByYmluZChzcmEuMTkuaW5jLCBzcmEuMTkuYnVsaykKCmZpZy5uIDwtIGZpZy5uICsgMQpzcmEuMTkuaW5jLmJsayAlPiUKICBtdXRhdGUoRUNPdHlwZSA9IHBhc3RlMChFQ08sIFR5cGUpLAogICAgICAgICBlY28gPSBmYWN0b3IoaWZlbHNlKEVDTyA9PSAicHAiLCAid2FybSIsCiAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoRUNPID09ICJ3ZiIsICJjb29sIiwgImNvbGQiKSksCiAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJ3YXJtIiwgImNvb2wiLCAiY29sZCIpKSwKICAgICAgICAgcG0gPSBpZmVsc2UoUE0gPT0gIkFOIiwgImFuZGVzaXRlIiwKICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKFBNID09ICJCUyIsICJiYXNhbHQiLCAiZ3Jhbml0ZSIpKSkgJT4lCiAgZ2dwbG90KC4sIGFlcyhkMTRjLCBseXJfYm90LCBjb2xvciA9IHBtLCBzaGFwZSA9IEVDT3R5cGUsIGxpbmV0eXBlID0gVHlwZSkpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgKwogIGdlb21fcG9pbnQoc2l6ZSA9IDMpICsKICBnZW9tX2Vycm9yYmFyaCgKICAgIGFlcyh4bWluID0gZDE0Y19sLCAKICAgICAgICB4bWF4ID0gZDE0Y191LAogICAgICAgIGNvbG9yID0gcG0pLCAKICAgIGhlaWdodCA9IDEuNSkgKwogIGdlb21fcGF0aCgpICsKICBzY2FsZV95X3JldmVyc2UoKSArCiAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWUgPSAiUGFyZW50IG1hdGVyaWFsIiwKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygiYW5kZXNpdGUiID0gImJsdWUiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmFzYWx0IiA9ICJyZWQiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ3Jhbml0ZSIgPSAiZGFya2dyYXkiKSkgKwogIHNjYWxlX3NoYXBlX21hbnVhbChuYW1lID0gIkVjb3N5c3RlbSAodHlwZSkiLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJwcGJ1bGsiID0gMTUsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3ZmJ1bGsiID0gMTYsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZmJ1bGsiID0gMTcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBwaW5jIiA9IDAsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3ZmluYyIgPSAxLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmZpbmMiID0gMiksCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoInBwYnVsayIgPSAid2FybSAoYnVsaykiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAid2ZidWxrIiA9ICJjb29sIChidWxrKSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZmJ1bGsiID0gImNvbGQgKGJ1bGspIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicHBpbmMiID0id2FybSAoaW5jKSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3ZmluYyIgPSAiY29vbCAoaW5jKSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZmluYyIgPSAiY29sZCAoaW5jKSIpKSArCiAgeGxhYihleHByZXNzaW9uKERlbHRhKicnXjE0KidDICjigLApJykpICsKICB5bGFiKCJEZXB0aCAoY20pIikgKwogIGZhY2V0X2dyaWQocm93cyA9IHZhcnMoZWNvKSwgY29scyA9IHZhcnMocG0pKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSkKYGBgCj4qKkZpZy4gYHIge2ZpZy5ufWAuICRcRGVsdGEkXjE0XkMgb2YgMjAxOSBidWxrIHNvaWwgaW5jdWJhdGlvbnMgYW5kIGNvcnJlc3BvbmRpbmcgYnVsayBzb2lsKioKCj4qQ2FwdGlvbjoqICRcRGVsdGEkXjE0XkMgb2YgYnVsayBzb2lsIGFuZCByZXNwaXJlZCBDT34yfiBieSBkZXB0aCBmb3IgZWFjaCBzaXRlIGluIDIwMTkuIEVycm9yIGJhcnMgc2hvdyBvbmUgc3RhbmRhcmQgZGV2aWF0aW9uIGZvciBidWxrIHNvaWwsIHBvaW50cyBzaG93IG1lYW4gb2YgdGhyZWUgcmVwbGljYXRlIHByb2ZpbGVzIGZvciBidWxrIHNvaWxzIGFuZCBzaW5nbGUgb2JzZXJ2YXRpb25zIGZvciByZXNwaXJlZCBDT34yfiAoc3RpbGwgd2FpdGluZyBmb3IgZGF0YSBmcm9tIGxhYm9yYXRvcnkgZHVwbGljYXRlcykuIAoKYGBge3IgcGxvdC1pbmMtYnVsay0xNGMtMjAxOX0KIyBmaXJzdCBtZXJnZSBtZWFuIDE0QyBkYXRhIGZyb20gMjAxOSBzYW1wbGVzIHdpdGggY29tcG9zaXRlIGluY3ViYXRpb24gZGF0YQpubXMuaW5jLmJsayA8LSBjKCJQTSIsICJFQ08iLCAiUE1lY28iLCAibHlyX3RvcCIsICJseXJfYm90IiwgIlllYXIiKQpzcmEuMTkuaW5jLmJsazIgPC0gbWVyZ2Uoc3JhLjE5LnN1bVt3aGljaChzcmEuMTkuc3VtJGx5cl9ib3QgPCAzMSksIGMobm1zLmluYy5ibGssICJkMTRjIiwgImQxNGNfdSIsICJkMTRjX2wiKV0sIAogICAgICAgICAgICAgICAgICAgICAgICBzcmEuMjAxOS5pbmMuZGZfMVsgLCBjKG5tcy5pbmMuYmxrLCAiZDE0YyIpXSwKICAgICAgICAgICAgICAgICAgICAgICAgYnkgPSBubXMuaW5jLmJsaywgc3VmZml4ZXMgPSBjKCIuYnVsayIsICIuaW5jIikpCgojIHJlZ3Jlc3MgYnVsayB2cy4gaW5jCm1pbi5pbmMuYmxrIDwtIG1pbihzcmEuMTkuaW5jLmJsazIkZDE0Y19sKSAjIGV4Y2x1ZGUgaGlnaGx5IG5lZ2F0aXZlIGluY3ViYXRpb24gc2FtcGxlIGZyb20gR1J3ZgptYXguaW5jLmJsayA8LSBtYXgoc3JhLjE5LmluYy5ibGsyJGQxNGNfdSwgc3JhLjE5LmluYy5ibGskZDE0Yy5pbmMpCgojIFdoYXQgaXMgdGhlIGlkZWFsIGdyb3VwaW5nL2V4cGVjdGVkIHJlbGF0aW9uc2hpcD8KZmlnLm4gPC0gZmlnLm4gKyAxCnNyYS4xOS5pbmMuYmxrMiAlPiUKICBtdXRhdGUoZGVwdGggPSBpZmVsc2UobHlyX3RvcCA9PSAwLCAiMC0xMGNtIiwgaWZlbHNlKGx5cl90b3AgPT0gMTAsICIxMC0yMGNtIiwgIjIwLTMwY20iKSkpICU+JQogIGdncGxvdCguLCBhZXMoZDE0Yy5idWxrLCBkMTRjLmluYywgY29sb3IgPSBQTSwgc2hhcGUgPSBFQ08sIGdyb3VwID0gUE0pKSArCiAgIyBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSBhdG0uZDE0LjIwMTksIGxpbmV0eXBlID0gImRhc2hlZCIpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwKSArCiAgIyBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSBhdG0uZDE0LjIwMTksIGxpbmV0eXBlID0gImRhc2hlZCIpICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArCiAgZ2VvbV9wb2ludChzaXplID0gMykgKwogICMgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIiwgc2UgPSBGQUxTRSkgKwogIGdlb21fZXJyb3JiYXJoKAogICAgYWVzKHhtaW4gPSBkMTRjX2wsIAogICAgICAgIHhtYXggPSBkMTRjX3UsCiAgICAgICAgY29sb3IgPSBQTSksIAogICAgaGVpZ2h0ID0gMS41KSArCiAgc2NhbGVfY29sb3JfbWFudWFsKG5hbWUgPSAiUGFyZW50IG1hdGVyaWFsIiwKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygiQU4iID0gImJsdWUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCUyIgPSAicmVkIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR1IiID0gImRhcmtncmF5IiksCiAgICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIkFOIiA9ICJhbmRlc2l0ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJTIj0gImJhc2FsdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdSIiA9ICJncmFuaXRlIikpICsKICBzY2FsZV9zaGFwZV9tYW51YWwobmFtZSA9ICJFY29zeXN0ZW0iLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJwcCIgPSAwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3ZiIgPSAxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZiIgPSAyKSwKICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygicHAiID0gIndhcm0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ3ZiIgPSAiY29vbCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJmIiA9ICJjb2xkIikpICsKICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzID0gYyhtaW4uaW5jLmJsaywgbWF4LmluYy5ibGspKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMobWluLmluYy5ibGssIG1heC5pbmMuYmxrKSkgKwogIGNvb3JkX2ZpeGVkKCkgKwogIHhsYWIoZXhwcmVzc2lvbignQnVsayBzb2lsICcqRGVsdGEqJydeMTQqJ0MgKOKAsCknKSkgKwogIHlsYWIoZXhwcmVzc2lvbignSW5jdWJhdGlvbiAnKkRlbHRhKicnXjE0KidDICjigLApJykpICsKICBmYWNldF9ncmlkKGNvbHMgPSB2YXJzKGRlcHRoKSkgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpCgojIGFsbCBkZXB0aHMgdG9nZXRoZXIsIGJ5IFBNCiMgc3JhLjE5LmluYy5ibGsgJT4lCiMgICBtdXRhdGUoZGVwdGggPSBpZmVsc2UobHlyX3RvcCA9PSAwLCAiMC0xMGNtIiwgaWZlbHNlKGx5cl90b3AgPT0gMTAsICIxMC0yMGNtIiwgIjIwLTMwY20iKSkpICU+JQojICAgZ2dwbG90KC4sIGFlcyhkMTRjLmJ1bGssIGQxNGMuaW5jLCBjb2xvciA9IGRlcHRoLCBzaGFwZSA9IEVDTykpICsKIyAgIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IGF0bS5kMTQuMjAxOSwgbGluZXR5cGUgPSAiZGFzaGVkIikgKwojICAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCkgKwojICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gYXRtLmQxNC4yMDE5LCBsaW5ldHlwZSA9ICJkYXNoZWQiKSArCiMgICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArCiMgICBnZW9tX3BvaW50KHNpemUgPSAzKSArCiMgICBnZW9tX2Vycm9yYmFyaCgKIyAgICAgYWVzKHhtaW4gPSBkMTRjX2wsIAojICAgICAgICAgeG1heCA9IGQxNGNfdSwKIyAgICAgICAgIGNvbG9yID0gZGVwdGgpLCAKIyAgICAgaGVpZ2h0ID0gMS41KSArCiMgICBzY2FsZV9zaGFwZV9tYW51YWwobmFtZSA9ICJFY29zeXN0ZW0iLAojICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoInBwIiA9IDAsIAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIndmIiA9IDEsIAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJmIiA9IDIpKSArCiMgICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzID0gYyhtaW4uaW5jLmJsaywgbWF4LmluYy5ibGspKSArCiMgICBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYyhtaW4uaW5jLmJsaywgbWF4LmluYy5ibGspKSArCiMgICBjb29yZF9maXhlZCgpICsKIyAgIHhsYWIoZXhwcmVzc2lvbignQnVsayBzb2lsICcqRGVsdGEqJydeMTQqJ0MgKOKAsCknKSkgKwojICAgeWxhYihleHByZXNzaW9uKCdJbmN1YmF0aW9uICcqRGVsdGEqJydeMTQqJ0MgKOKAsCknKSkgKwojICAgZmFjZXRfZ3JpZChjb2xzID0gdmFycyhQTSkpICsKIyAgIHRoZW1lX2J3KCkgKwojICAgdGhlbWUocGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSkKYGBgCj4qKkZpZy4gYHIge2ZpZy5ufWAuIFJlZ3Jlc3Npb24gb2YgMjAxOSBidWxrIHNvaWwgaW5jdWJhdGlvbnMgYW5kIGNvcnJlc3BvbmRpbmcgYnVsayBzb2lsICRcRGVsdGEkXjE0XkMqKgoKPipDYXB0aW9uOiogUmVncmVzc2lvbnMgb2YgJFxEZWx0YSReMTReQyBvZiBidWxrIHNvaWwgYW5kIHJlc3BpcmVkIENPfjJ+IGJ5IGRlcHRoIGZvciBlYWNoIHNpdGUgaW4gMjAxOS4gRXJyb3IgYmFycyBzaG93IG9uZSBzdGFuZGFyZCBkZXZpYXRpb24gZm9yIGJ1bGsgc29pbCwgcG9pbnRzIHNob3cgbWVhbiBvZiB0aHJlZSByZXBsaWNhdGUgcHJvZmlsZXMgZm9yIGJ1bGsgc29pbHMgYW5kIHNpbmdsZSBvYnNlcnZhdGlvbnMgZm9yIHJlc3BpcmVkIENPfjJ+IChzdGlsbCB3YWl0aW5nIGZvciBkYXRhIGZyb20gbGFib3JhdG9yeSBkdXBsaWNhdGVzKS4KCiMjIFRpbWUgc2VyaWVzOiAkXERlbHRhJF4xNF5DIGJ5IGRlcHRoIChhcyBtZWFzdXJlZCkKYGBge3IgcGxvdC10aW1lc2VyaWVzLW1lYXMtZGVwdGhzfQojIGNvbWJpbmUgJzAxLCAnMDksICcxOSBkYXRhCnNyYS4wMS4wOS4xOS5yYXcgPC0gcmJpbmQoYmluZF9yb3dzKHNyYS4yMDAxLnN1bS5scyksCiAgICAgICAgICAgICAgICAgICAgICAgICAgYmluZF9yb3dzKHNyYS4yMDE5LnN1bS5scykpCnNyYS4yMDA5LmxzIDwtIHNwbGl0KHJhczE4Lmx5ciwgcmFzMTgubHlyJFBNZWNvKQpzcmEuMjAwOS5kZiA8LSBiaW5kX3Jvd3Moc3JhLjIwMDkubHMpCmNvbG5hbWVzKHNyYS4yMDA5LmRmKVt3aGljaChjb2xuYW1lcyhzcmEuMjAwOS5kZikgPT0gImx5cl8xNGMiKV0gPC0gImQxNGMiCnNyYS4yMDA5LmRmIDwtIHNyYS4yMDA5LmRmWyAsIHdoaWNoKG5hbWVzKHNyYS4yMDA5LmRmKSAlaW4lIG5hbWVzKHNyYS4wMS4wOS4xOS5yYXcpKV0Kc3JhLjIwMDkuZGYgPC0gY2JpbmQoc3JhLjIwMDkuZGYsIAogICAgICAgICAgICAgICAgICAgICBmbSA9IE5BLAogICAgICAgICAgICAgICAgICAgICBkMTRjX3NkID0gTkEsCiAgICAgICAgICAgICAgICAgICAgIGZtX3NkID0gTkEpCnNyYS4wMS4wOS4xOS5yYXcgPC0gcmJpbmQoc3JhLjAxLjA5LjE5LnJhdywgc3JhLjIwMDkuZGYpCnNyYS4wMS4wOS4xOS5yYXckWWVhciA8LSBmYWN0b3IoYyhyZXAoMjAwMSwgbnJvdyhiaW5kX3Jvd3Moc3JhLjIwMDEuc3VtLmxzKSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwKDIwMTksIG5yb3coYmluZF9yb3dzKHNyYS4yMDE5LnN1bS5scykpKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcCgyMDA5LCBucm93KHNyYS4yMDA5LmRmKSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIjIwMDEiLCAiMjAwOSIsICIyMDE5IikpCgojIHBsb3QKIyB3LyByaWJib25zCiMgc3JhLjAxLjA5LjE5LnJhdyAlPiUKIyAgIG11dGF0ZShQTWVjb195ZWFyID0gcGFzdGUwKFBNZWNvLCBZZWFyKSwKIyAgICAgICAgICBlY28gPSBmYWN0b3IoaWZlbHNlKEVDTyA9PSAicHAiLCAid2FybSIsCiMgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShFQ08gPT0gIndmIiwgImNvb2wiLCAiY29sZCIpKSwKIyAgICAgICAgICAgICAgICAgICAgICAgbGV2ZWxzID0gYygid2FybSIsICJjb29sIiwgImNvbGQiKSksCiMgICAgICAgICAgZDE0Y191ID0gZDE0YyArIGQxNGNfc2QsCiMgICAgICAgICAgZDE0Y19sID0gZDE0YyAtIGQxNGNfc2QsCiMgICAgICAgICAgcG0gPSBpZmVsc2UoUE0gPT0gIkFOIiwgImFuZGVzaXRlIiwKIyAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoUE0gPT0gIkJTIiwgImJhc2FsdCIsICJncmFuaXRlIikpKSAlPiUKIyAgIGdncGxvdCguLCBhZXMoZDE0YywgbHlyX2JvdCwgZ3JvdXAgPSBQTWVjb195ZWFyKSkgKwojICAgZ2VvbV92bGluZSh4aW50ZXJjZXB0ID0gMCkgKwojICAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgKwojICAgZ2VvbV9yaWJib24oYWVzKHhtaW4gPSBkMTRjX2wsIHhtYXggPSBkMTRjX3UsIGZpbGwgPSBwbSwgYWxwaGEgPSBZZWFyLCBncm91cCA9IFBNZWNvX3llYXIpLAojICAgICAgICAgICAgICAgY29sb3IgPSBOQSwgc2hvdy5sZWdlbmQgPSBGQUxTRSkgKwojICAgZ2VvbV9wb2ludChhZXMoZmlsbCA9IHBtLCBjb2xvciA9IHBtLCBzaGFwZSA9IGVjbywgYWxwaGEgPSBZZWFyKSwgc2l6ZSA9IDIpICsKIyAgIGdlb21fcG9pbnQoYWVzKHNoYXBlID0gZWNvKSwgY29sb3IgPSAiYmxhY2siLCBzaXplID0gMykgKwojICAgZ2VvbV9wYXRoKGFlcyhsaW5ldHlwZSA9IFllYXIsIGNvbG9yID0gcG0pLCBzaXplID0gMC43KSArCiMgICBzY2FsZV95X3JldmVyc2UoKSArCiMgICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICJQYXJlbnQgbWF0ZXJpYWwiLAojICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoImFuZGVzaXRlIiA9ICJibHVlIiwgCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmFzYWx0IiA9ICJyZWQiLCAKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJncmFuaXRlIiA9ICJkYXJrZ3JheSIpKSArCiMgICBzY2FsZV9maWxsX21hbnVhbChuYW1lID0gIlBhcmVudCBtYXRlcmlhbCIsCiMgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJhbmRlc2l0ZSIgPSAiYmx1ZSIsIAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmFzYWx0IiA9ICJyZWQiLCAKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdyYW5pdGUiID0gImRhcmtncmF5IikpICsKIyAgIHNjYWxlX3NoYXBlX21hbnVhbChuYW1lID0gIkVjb3N5c3RlbSIsCiMgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygid2FybSIgPSAyMiwgCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29vbCIgPSAyMSwgCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29sZCIgPSAyNCkpICsKIyAgIHNjYWxlX2FscGhhX21hbnVhbCh2YWx1ZXMgPSBjKCIyMDAxIiA9IC42LAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjIwMDkiID0gMC40LAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjIwMTkiID0gMC4yKSkgKwojICAgZmFjZXRfZ3JpZChyb3dzID0gdmFycyhlY28pLCBjb2xzID0gdmFycyhwbSkpICsKIyAgIHhsYWIoZXhwcmVzc2lvbihEZWx0YSonJ14xNConQyAo4oCwKScpKSArCiMgICB5bGFiKCJEZXB0aCAoY20pIikgKwojICAgdGhlbWVfYncoKSArCiMgICB0aGVtZShwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpKQoKIyB3aXRoIGVycm9yIGJhcnMKIyBzcmEuMDEuMDkuMTkucmF3ICU+JQojICAgbXV0YXRlKFBNZWNvX3llYXIgPSBwYXN0ZTAoUE1lY28sIFllYXIpLAojICAgICAgICAgIGVjbyA9IGZhY3RvcihpZmVsc2UoRUNPID09ICJwcCIsICJ3YXJtIiwKIyAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKEVDTyA9PSAid2YiLCAiY29vbCIsICJjb2xkIikpLAojICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJ3YXJtIiwgImNvb2wiLCAiY29sZCIpKSwKIyAgICAgICAgICBkMTRjX3UgPSBkMTRjICsgZDE0Y19zZCwKIyAgICAgICAgICBkMTRjX2wgPSBkMTRjIC0gZDE0Y19zZCwKIyAgICAgICAgICBwbSA9IGlmZWxzZShQTSA9PSAiQU4iLCAiYW5kZXNpdGUiLAojICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShQTSA9PSAiQlMiLCAiYmFzYWx0IiwgImdyYW5pdGUiKSkpICU+JQojICAgZ2dwbG90KC4sIGFlcyhkMTRjLCBseXJfYm90LCBncm91cCA9IFBNZWNvX3llYXIpKSArCiMgICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwKSArCiMgICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArCiMgICBnZW9tX3BvaW50KGFlcyhmaWxsID0gcG0sIGNvbG9yID0gcG0sIHNoYXBlID0gZWNvLCBhbHBoYSA9IFllYXIpLCBzaXplID0gMy41KSArCiMgICBnZW9tX3BhdGgoYWVzKGxpbmV0eXBlID0gWWVhciwgY29sb3IgPSBwbSksIHNpemUgPSAwLjcpICsKIyAgIGdlb21fZXJyb3JiYXJoKAojICAgICBhZXMoeG1pbiA9IGQxNGNfbCwKIyAgICAgICAgIHhtYXggPSBkMTRjX3UsCiMgICAgICAgICBjb2xvciA9IHBtLAojICAgICAgICAgYWxwaGEgPSBZZWFyKSwKIyAgICAgaGVpZ2h0ID0gMS41KSArCiMgICBzY2FsZV95X3JldmVyc2UoKSArCiMgICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICJQYXJlbnQgbWF0ZXJpYWwiLAojICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoImFuZGVzaXRlIiA9ICJibHVlIiwgCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmFzYWx0IiA9ICJyZWQiLCAKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJncmFuaXRlIiA9ICJkYXJrZ3JheSIpKSArCiMgICBzY2FsZV9maWxsX21hbnVhbChuYW1lID0gIlBhcmVudCBtYXRlcmlhbCIsCiMgICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJhbmRlc2l0ZSIgPSAiYmx1ZSIsIAojICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYmFzYWx0IiA9ICJyZWQiLCAKIyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdyYW5pdGUiID0gImRhcmtncmF5IikpICsKIyAgIHNjYWxlX3NoYXBlX21hbnVhbChuYW1lID0gIkVjb3N5c3RlbSIsCiMgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygid2FybSIgPSAxNSwgCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29vbCIgPSAxNiwgCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29sZCIgPSAxNykpICsKIyAgIHNjYWxlX2FscGhhX21hbnVhbCh2YWx1ZXMgPSBjKCIyMDAxIiA9IDEsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMjAwOSIgPSAwLjYsCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMjAxOSIgPSAwLjMpKSArCiMgICBmYWNldF9ncmlkKHJvd3MgPSB2YXJzKGVjbyksIGNvbHMgPSB2YXJzKHBtKSkgKwojICAgeGxhYihleHByZXNzaW9uKERlbHRhKicnXjE0KidDICjigLApJykpICsKIyAgIHlsYWIoIkRlcHRoIChjbSkiKSArCiMgICB0aGVtZV9idygpICsKIyAgIHRoZW1lKHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpCgojIGp1c3QgdG9wc29pbCwgdy8gZXJyb3IgYmFycwpmaWcubiA8LSBmaWcubiArIDEKc3JhLjAxLjA5LjE5LnJhdyA8LSBzcmEuMDEuMDkuMTkucmF3W29yZGVyKHNyYS4wMS4wOS4xOS5yYXckbHlyX3RvcCksIF0Kc3JhLjAxLjA5LjE5LnJhdyAlPiUKICBtdXRhdGUoUE1lY29feWVhciA9IHBhc3RlMChQTWVjbywgWWVhciksCiAgICAgICAgIGVjbyA9IGZhY3RvcihpZmVsc2UoRUNPID09ICJwcCIsICJ3YXJtIiwKICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShFQ08gPT0gIndmIiwgImNvb2wiLCAiY29sZCIpKSwKICAgICAgICAgICAgICAgICAgICAgIGxldmVscyA9IGMoIndhcm0iLCAiY29vbCIsICJjb2xkIikpLAogICAgICAgICBkMTRjX3UgPSBkMTRjICsgZDE0Y19zZCwKICAgICAgICAgZDE0Y19sID0gZDE0YyAtIGQxNGNfc2QsCiAgICAgICAgIHBtID0gaWZlbHNlKFBNID09ICJBTiIsICJhbmRlc2l0ZSIsCiAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShQTSA9PSAiQlMiLCAiYmFzYWx0IiwgImdyYW5pdGUiKSkpICU+JQogIGdncGxvdCguLCBhZXMoZDE0YywgbHlyX2JvdCwgZ3JvdXAgPSBQTWVjb195ZWFyKSkgKwogIGdlb21fdmxpbmUoeGludGVyY2VwdCA9IDApICsKICBnZW9tX2hsaW5lKHlpbnRlcmNlcHQgPSAwKSArCiAgZ2VvbV9wb2ludChhZXMoZmlsbCA9IHBtLCBjb2xvciA9IHBtLCBzaGFwZSA9IGVjbywgYWxwaGEgPSBZZWFyKSwgc2l6ZSA9IDMpICsKICBnZW9tX3BhdGgoYWVzKGxpbmV0eXBlID0gWWVhciwgY29sb3IgPSBwbSksIHNpemUgPSAwLjcpICsKICBnZW9tX2Vycm9yYmFyaCgKICAgIGFlcyh4bWluID0gZDE0Y19sLAogICAgICAgIHhtYXggPSBkMTRjX3UsCiAgICAgICAgY29sb3IgPSBwbSwKICAgICAgICBhbHBoYSA9IFllYXIpLAogICAgaGVpZ2h0ID0gMS41KSArCiAgc2NhbGVfeV9yZXZlcnNlKGxpbWl0cyA9IGMoNDEsIDApKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cyA9IGMoLTE2MCwgMTkwKSkgKwogIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gIlBhcmVudCBtYXRlcmlhbCIsCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoImFuZGVzaXRlIiA9ICJibHVlIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJhc2FsdCIgPSAicmVkIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdyYW5pdGUiID0gImRhcmtncmF5IikpICsKICBzY2FsZV9maWxsX21hbnVhbChuYW1lID0gIlBhcmVudCBtYXRlcmlhbCIsCiAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygiYW5kZXNpdGUiID0gImJsdWUiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYXNhbHQiID0gInJlZCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdyYW5pdGUiID0gImRhcmtncmF5IikpICsKICBzY2FsZV9zaGFwZV9tYW51YWwobmFtZSA9ICJFY29zeXN0ZW0iLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJ3YXJtIiA9IDE1LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29vbCIgPSAxNiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbGQiID0gMTcpKSArCiAgc2NhbGVfYWxwaGFfbWFudWFsKHZhbHVlcyA9IGMoIjIwMDEiID0gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMjAwOSIgPSAwLjYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjIwMTkiID0gMC4zKSkgKwogIGZhY2V0X2dyaWQocm93cyA9IHZhcnMoZWNvKSwgY29scyA9IHZhcnMocG0pKSArCiAgeGxhYihleHByZXNzaW9uKERlbHRhKicnXjE0KidDICjigLApJykpICsKICB5bGFiKCJEZXB0aCAoY20pIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpCmBgYAo+KipGaWcuIGByIHtmaWcubn1gLiBUaW1lIHNlcmllcyBvZiAkXERlbHRhJF4xNF5DIGJ5IGRlcHRoLCBhcyBtZWFzdXJlZCoqCgo+KkNhcHRpb246KiBQb2ludHMgc2hvdyBtZWFuIG9mIHRocmVlIHByb2ZpbGUgcmVwbGljYXRlcyBmb3IgMjAwMSBhbmQgMjAxOSBzYW1wbGVzLiBFcnJvciBiYXJzIHNob3cgwrEgMSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgdGhlIG1lYW4gKG9ubHkgYSBzaW5nbGUgcHJvZmlsZSB3YXMgYW5hbHl6ZWQgaW4gMjAwOSkuIAoKIyMgU3BsaW5lIGZpdHRpbmcKKkZpdCBzcGxpbmVzIHRvIDIwMDkgZGF0YSB0byBwcmVkaWN0IGF0IDIwMDEgZGVwdGhzKgoKU29pbHMgY29sbGVjdGVkIGluIGJvdGggdGhlIDIwMDEgYW5kIDIwMDkgc2FtcGxpbmcgY2FtcGFpZ25zIHdlcmUgc2FtcGxlZCBieSBob3Jpem9uLCBidXQgdGhlIGRlcHRoIGludGVydmFscyBkaWZmZXJlZCBiZXR3ZWVuIHRoZSB0d28gc2FtcGxpbmcgeWVhcnMuIEluIDIwMDksIGZ1bGwgcHJvZmlsZXMgd2VyZSBleGNhdmF0ZWQgZm9yIGVhY2ggc2l0ZSwgYXMgb3Bwb3NlZCB0byB0aGUgc2hvcnRlciBwcm9maWxlcyBjb2xsZWN0ZWQgaW4gMjAwMSBmcm9tIHRoZSBHUiBhbmQgQU4gc2l0ZXMuIFJhZGlvY2FyYm9uIHdhcyBtZWFzdXJlZCBvbiBhbGwgdGhyZWUgcmVwbGljYXRlIHByb2ZpbGVzIGF0IGVhY2ggc2l0ZSBmb3IgdGhlIDIwMDEgc2FtcGxlcywgYnV0IG9ubHkgZm9yIG9uZSBvZiB0aGUgcmVwbGljYXRlIHByb2ZpbGVzIGF0IGVhY2ggc2l0ZSBpbiAyMDA5LCBlLmcuIEFOcHAgcmVwMiwgZXRjLgoKSW4gb3JkZXIgdG8gY29tcGFyZSB0aGUgcmFkaW9jYXJib24gcHJvZmlsZXMgYmV0d2VlbiAyMDAxLCAyMDA5LCBhbmQgMjAxOSB3ZSBpbnRlcnBvbGF0ZWQgYm90aCByYWRpb2NhcmJvbiBhbmQgY2FyYm9uIHN0b2NrIGRhdGEgYXQgMSBjbSBpbnRlcnZhbHMgZm9yIGVhY2ggc2l0ZSBpbiB0aGUgMjAwOSBhbmQgMjAxOSBkYXRhc2V0cywgYW5kIHRoZW4gc3VtbWVkIHRoZSBjYXJib24tc3RvY2std2VpZ2h0ZWQgcmFkaW9jYXJib24gdmFsdWVzIGZvciBlYWNoIGRlcHRoIGludGVydmFsIHNhbXBsZWQgaW4gMjAwMS4gQSBtb25vdG9uaWMgY3ViaWMgc3BsaW5lIGZpdCB3YXMgdXNlZCBmb3IgdGhlIGNhcmJvbiBzdG9jayBpbnRlcnBvbGF0aW9uIChXZW5kdCBhbmQgSGF1c2VyIDIwMTMpLCBhbmQgYSBtYXNzLXByZXNlcnZpbmcgc3BsaW5lIHdhcyB1c2VkIHRvIGZpdCB0aGUgcmFkaW9jYXJib24gZGF0YSAoQmlzaG9wLCBULkYuQS4sIE1jQnJhdG5leSwgQS5CLiwgTGFzbGV0dCwgRy5NLiwgKDE5OTkpIE1vZGVsbGluZyBzb2lsIGF0dHJpYnV0ZSBkZXB0aCBmdW5jdGlvbnMgd2l0aCBlcXVhbC1hcmVhIHF1YWRyYXRpYyBzbW9vdGhpbmcgc3BsaW5lcy4gR2VvZGVybWEsIDkxKDEtMik6IDI3LTQ1KS4KCmBgYHtyIGNuLWNsZWFuLCBpbmNsdWRlID0gRkFMU0V9CmVsbV9yZXN1bHRzX2RmIDwtIGJpbmRfcm93cyh1bmxpc3QoZWxtX3Jlc3VsdHNfbHMsIHJlY3Vyc2l2ZSA9IEZBTFNFKSkKIyBTcGxpdCBJRHMKUE1lY29fcmVwX2RlcHRoIDwtIGJpbmRfcm93cygKICBsYXBwbHkoc3Ryc3BsaXQoZWxtX3Jlc3VsdHNfZGYkSUQsICJfIiksIGZ1bmN0aW9uKHgpIHsgCiAgICBkZiA8LSAgZGF0YS5mcmFtZShQTWVjbyA9IHhbMl0sCiAgICAgICAgICAgICAgICAgICAgICBwcm9fcmVwID0geFszXSwKICAgICAgICAgICAgICAgICAgICAgIGRlcHRoID0geFs0XSkKICAgIGRmJFBNIDwtIHN1YnN0cihkZiRQTWVjbywgMSwgMikKICAgIGRmJEVDTyA8LSBzdWJzdHIoZGYkUE1lY28sIDMsIDQpCiAgICByZXR1cm4oZGYpCiAgfSkKKQplbG1fcmVzdWx0c19kZiA8LSBjYmluZChlbG1fcmVzdWx0c19kZiwgUE1lY29fcmVwX2RlcHRoKQpgYGAKCmBgYHtyIHNvYy0yMDAxLCBpbmNsdWRlID0gRkFMU0V9CiMgYWRkIFNPQyBkYXRhIChseXJfc29jX2tnbTIpIHRvIHNyYS4yMDAxLmxzCnNvYy4yMDAxIDwtIGRhdGEuZnJhbWUocmVhZF9leGNlbCgiLi4vZGF0YS9leHRlcm5hbC9zcmFfcmFzX3N1bS9zaWVycmFfZGF0YV9zdW1tYXJ5XzIwMjAueGxzeCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGVldCA9ICIyMDAxX2J1bGtfZGF0YSIpKQpzb2MuMjAwMSA8LSB0eXBlLmNvbnZlcnQoc29jLjIwMDFbY29tcGxldGUuY2FzZXMoc29jLjIwMDEpLCBdKQpzb2MuMjAwMSRseXJfc29jX2tnbTIgPC0gc29jLjIwMDEkQy4gKiBzb2MuMjAwMSRiZC5nLmNtMyAqIHNvYy4yMDAxJGx5cl9ib3QgLSBzb2MuMjAwMSRseXJfdG9wICogMTBeLTEKbm1zLjIwMDEgPC0gYygiUE1lY28iLCAibHlyX3RvcCIsICJseXJfYm90IiwgInByb19yZXAiKQpzcmEuMjAwMS5scyA8LSBsYXBwbHkoc3JhLjIwMDEubHMsIGZ1bmN0aW9uKGRmKSB7CiAgbWVyZ2UoZGYsIHNvYy4yMDAxWyAsIGMobm1zLjIwMDEsICJseXJfc29jX2tnbTIiKV0sIGJ5ID0gbm1zLjIwMDEpCn0pCgojIGNhbGN1bGF0ZSBjdW11bGF0aXZlIHN0b2NrcwojIG9yZGVyIDIwMDEgZGF0YQpzcmEuMjAwMS5scyA8LSBsYXBwbHkoc3JhLjIwMDEubHMsIGZ1bmN0aW9uKGRmKSB7CiAgbHMgPC0gc3BsaXQoZGYsIGRmJHByb19uYW1lKQogIGxzIDwtIGxhcHBseShscywgZnVuY3Rpb24oeCkgewogICAgeCA8LSB4W29yZGVyKHgkbHlyX2JvdCksIF0KICAgIHgkbHlyX3NvY19jbXR2IDwtIE5BCiAgICBmb3IoaSBpbiBzZXFfYWxvbmcoeCRseXJfYm90KSkgewogICAgICBpZihpID09IDEpIHsKICAgICAgICB4JGx5cl9zb2NfY210dltpXSA8LSB4JGx5cl9zb2Nfa2dtMltpXQogICAgICB9IGVsc2UgewogICAgICAgIHgkbHlyX3NvY19jbXR2W2ldIDwtIHgkbHlyX3NvY19rZ20yW2ldICsgeCRseXJfc29jX2NtdHZbaS0xXSAKICAgICAgfQogICAgfQogICAgcmV0dXJuKHgpCiAgfSkKICByZXR1cm4odW5zcGxpdChscywgZGYkcHJvX25hbWUpKQp9KQpgYGAKCmBgYHtyIHNwbGluZS1mbSwgaW5jbHVkZSA9IEZBTFNFfQojIyBzcGxpbmUgZml0IGZvciBmbQpzcmEuMjAwMS5mbS5zcCA8LSBsYXBwbHkoc3JhLjIwMDEubHMsIGZ1bmN0aW9uKGRmKSB7CiAgbGFwcGx5KHNwbGl0KGRmLCBkZiRwcm9fbmFtZSksIGZ1bmN0aW9uKHgpIHsKICAgIGRlcHRocyh4KSA8LSBwcm9fbmFtZSB+IGx5cl90b3AgKyBseXJfYm90CiAgICB4Lm1wcyA8LSBtcHNwbGluZSh4LCB2YXIubmFtZSA9ICJmbSIpCiAgICB4Lm1wcyR2YXIuMWNtIDwtIHgubXBzJHZhci4xY21bMTptYXgoeCRseXJfYm90KV0KICAgIHJldHVybih4Lm1wcykKICB9KQp9KQojIDIwMDkKc3JhLjIwMDkuZm0uc3AgPC0gbGFwcGx5KHNyYS4yMDA5LmxzLCBmdW5jdGlvbih4KSB7CiAgZGVwdGhzKHgpIDwtIHByb19uYW1lIH4gbHlyX3RvcCArIGx5cl9ib3QKICB4Lm1wcyA8LSBtcHNwbGluZSh4LCB2YXIubmFtZSA9ICJseXJfZnJhY3Rpb25fbW9kZXJuIikKICB4Lm1wcyR2YXIuMWNtIDwtIHgubXBzJHZhci4xY21bMTptYXgoeCRseXJfYm90KV0KICByZXR1cm4oeC5tcHMpCn0pCiMgMjAxOQpzcmEuMjAxOS5mbS5zcCA8LSBsYXBwbHkoc3JhLjIwMTkubHMsIGZ1bmN0aW9uKGRmKSB7CiAgbGFwcGx5KHNwbGl0KGRmLCBkZiRwcm9fbmFtZSksIGZ1bmN0aW9uKHgpIHsKICAgIGRlcHRocyh4KSA8LSBwcm9fbmFtZSB+IGx5cl90b3AgKyBseXJfYm90CiAgICB4Lm1wcyA8LSBtcHNwbGluZSh4LCB2YXIubmFtZSA9ICJmbSIpCiAgICB4Lm1wcyR2YXIuMWNtIDwtIHgubXBzJHZhci4xY21bMTptYXgoeCRseXJfYm90KV0KICAgIHJldHVybih4Lm1wcykKICB9KQp9KQpgYGAKCmBgYHtyIHNwbGluZS1iZC1zb2MtMTksIGluY2x1ZGUgPSBGQUxTRX0KIyBOZWVkIFNPQyBzdG9jayBkYXRhIGZvciAyMDE5IHNhbXBsZXM6IHVzZSBCRCBmcm9tIDIwMDkgc2FtcGxlcyAKIyBzcGxpbmUgZml0IGZvciBidWxrIGRlbnNpdHkKc3JhLjIwMDkuYmQuc3AgPC0gbGFwcGx5KHNyYS4yMDA5LmxzLCBmdW5jdGlvbih4KSB7CiAgZGVwdGhzKHgpIDwtIHByb19uYW1lIH4gbHlyX3RvcCArIGx5cl9ib3QKICB4Lm1wcyA8LSBtcHNwbGluZSh4LCB2YXIubmFtZSA9ICJseXJfYmRfc2FtcCIpCiAgeC5tcHMkdmFyLjFjbSA8LSB4Lm1wcyR2YXIuMWNtWzE6MTAwXQogIHJldHVybih4Lm1wcykKfSkKc3JhLjIwMDkuYmQuc3AgPC0gbGFwcGx5KHNyYS4yMDA5LmJkLnNwLCBmdW5jdGlvbihscykgewogIGRmIDwtIGRhdGEuZnJhbWUobHNbInZhci4xY20iXSkKICBpeCA8LSB3aGljaChpcy5uYShkZiR2YXIuMWNtKSkKICBkZiR2YXIuMWNtW2l4XSA8LSBkZiR2YXIuMWNtW2l4WzFdLTFdCiAgcmV0dXJuKGRmKQp9KQoKIyBjYWxjdWxhdGUgbWVhbiBvZiAxY20gQkQgcHJlZGljdGlvbnMgZm9yIGVhY2ggZGVwdGggaW5jcmVtZW50CmJkX3ByZWQgPC0gbGFwcGx5KHNlcV9hbG9uZyhzcmEuMjAwOS5iZC5zcCksIGZ1bmN0aW9uKGkpIHsKICBscyA8LSBzcGxpdChzcmEuMjAxOS5sc1tbaV1dLCBzcmEuMjAxOS5sc1tbaV1dWyJwcm9fcmVwIl0pICMgc3BsaXQgZWFjaCByZXBsaWNhdGUgcHJvZmlsZQogIGxzIDwtIGxhcHBseShzZXFfYWxvbmcobHMpLCBmdW5jdGlvbihkZikgewogICAgZCA8LSBsc1tbZGZdXVtbImx5cl9ib3QiXV0gIyBkZXB0aCBpbnRlcnZhbHMKICAgIGMgPC0gdmVjdG9yKG1vZGUgPSAibGlzdCIsIGxlbmd0aCA9IGxlbmd0aChkKSkgIyB2ZWN0b3IgZm9yIGF2ZXJhZ2luZyAxIGNtIGJkIHByZWQKICAgIGZvcihqIGluIHNlcV9hbG9uZyhkKSkgewogICAgICBpZihqID09IDEpIHsKICAgICAgICBjW1tqXV0gPC0gbWVhbihzcmEuMjAwOS5iZC5zcFtbaV1dWzE6ZFtqXSwgInZhci4xY20iXSkgIyAxLTEwCiAgICAgIH0gZWxzZSB7CiAgICAgICAgY1tbal1dIDwtIG1lYW4oc3JhLjIwMDkuYmQuc3BbW2ldXVsoZFtqLTFdKzEpOmRbal0sICJ2YXIuMWNtIl0pICMgMTAgY20gaW5jcmVtZW50cwogICAgICB9CiAgICB9CiAgICByZXR1cm4odW5saXN0KGMpKQogICAgfSkKICByZXR1cm4odW5zcGxpdChscywgc3JhLjIwMTkubHNbW2ldXVsicHJvX3JlcCJdKSkKfSkKCiMgbWVyZ2UgcHJlZGljdGVkIGJkIHZhbHVlcyB3aXRoIHNyYS4yMDE5LmxzCm5tcyA8LSBuYW1lcyhzcmEuMjAxOS5scykKc3JhLjIwMTkubHMgPC0gbGFwcGx5KHNlcV9hbG9uZyhzcmEuMjAxOS5scyksIGZ1bmN0aW9uKGRmKSB7CiAgY2JpbmQoc3JhLjIwMTkubHNbW2RmXV0sIGJkID0gYmRfcHJlZFtbZGZdXSkKfSkKbmFtZXMoc3JhLjIwMTkubHMpIDwtIG5tcwoKIyBhZGQgYyBjb25jCnNyYS4yMDE5LmxzIDwtIGxhcHBseShzcmEuMjAxOS5scywgZnVuY3Rpb24oZGYpIHsKICBkZiRkZXB0aCA8LSBwYXN0ZTAoZGYkbHlyX3RvcCwgIi0iLCBkZiRseXJfYm90KQogIGRmIDwtIG1lcmdlKGRmLCBlbG1fcmVzdWx0c19kZlsgLCBjKCJQTWVjbyIsICJwcm9fcmVwIiwgImRlcHRoIiwgIkMiLCAiTiIpXSwgYnkgPSBjKCJQTWVjbyIsICJkZXB0aCIsICJwcm9fcmVwIikpCiAgcmV0dXJuKGRmKQp9KQoKIyBjYWxjdWxhdGUgc3RvY2tzCnNyYS4yMDE5LmxzIDwtIGxhcHBseShzcmEuMjAxOS5scywgZnVuY3Rpb24oZGYpIHsKICBkZiRseXJfc29jIDwtIGRmJGJkICogZGYkQyAjIHVuaXRzIHdvcmsgb3V0IHRvIGtnX20yIAogIHJldHVybihkZikKfSkKIyBjYWxjdWxhdGUgY210diBzdG9ja3MKc3JhLjIwMTkubHMgPC0gbGFwcGx5KHNyYS4yMDE5LmxzLCBmdW5jdGlvbihkZikgewogIGxzIDwtIHNwbGl0KGRmLCBkZiRwcm9fbmFtZSkKICBscyA8LSBsYXBwbHkobHMsIGZ1bmN0aW9uKHgpIHsKICAgIHgkbHlyX3NvY19jbXR2IDwtIE5BCiAgICBmb3IoaSBpbiBzZXFfYWxvbmcoeCRseXJfYm90KSkgewogICAgICBpZihpID09IDEpIHsKICAgICAgICB4JGx5cl9zb2NfY210dltpXSA8LSB4JGx5cl9zb2NbaV0KICAgICAgfSBlbHNlIHsKICAgICAgICB4JGx5cl9zb2NfY210dltpXSA8LSB4JGx5cl9zb2NbaV0gKyB4JGx5cl9zb2NfY210dltpLTFdIAogICAgICB9CiAgICB9CiAgICByZXR1cm4oeCkKICB9KQogIHJldHVybih1bnNwbGl0KGxzLCBkZiRwcm9fbmFtZSkpCn0pCmBgYAoKYGBge3Igc3BsaW5lLXNvYywgaW5jbHVkZSA9IEZBTFNFfQojIHNwbGluZSBmaXQgZm9yIGNhcmJvbiBzdG9ja3MgKGZvciBjYWxjIHdlaWdodGVkIGF2ZXJhZ2VzKQpkZXB0aC5zcGxpbmUgPC0gZnVuY3Rpb24oeCkgewogIHNwIDwtIHNwbGluZSh4LCBtZXRob2QgPSAiaHltYW4iKSAjIGZpdCBtb25vdG9uaWMgY3ViaWMgc3BsaW5lCiAgc3Auc3MgPC0gc21vb3RoLnNwbGluZShzcCkgIyBjb252ZXJ0IHRvIGNsYXNzICJzcGxpbmUiIHdpdGggc21vb3RoLnNwbGluZSBmeG4KICBzdGQgPC0gc2VxKDAsIDEwMCkgIyBpbiBjbSAobGluZWFyIGJleW9uZCBsYXN0IG1lYXN1cmVkIGRlcHRoKQogIHNwIDwtIHByZWRpY3Qoc3Auc3MsIHN0ZCkgCiAgZGYgPC0gZGF0YS5mcmFtZShzcCkKICBjb2xuYW1lcyhkZikgPC0gYygibHlyX2JvdCIsImx5cl9zb2MiKQogIGZvcihpIGluIHNlcV9hbG9uZyhkZiRseXJfYm90KSkgewogICAgaWYoaSA9PSAxKSB7CiAgICAgIGRmJGx5cl9zb2NbaV0gPC0gZGYkbHlyX3NvY1tpXQogICAgfSBlbHNlIHsKICAgICAgZGYkbHlyX3NvY1tpXSA8LSBkZiRseXJfc29jW2kgKyAxXSAtIGRmJGx5cl9zb2NbaV0KICAgIH0KICB9CiAgZGYgPC0gZGZbLTEsXQogIHJldHVybihkZlstbGVuZ3RoKGRmJGx5cl9zb2MpLCBdKQp9CgojIGFkZCAoMCwgMCkgcG9pbnQgZm9yIChseXJfYm90LCBseXJfY210dl9zdG9jaykKc3JhLjIwMDEuc3AubHMgPC0gbGFwcGx5KHNyYS4yMDAxLmxzLCBmdW5jdGlvbihkZikgewogIGxzIDwtIGxhcHBseShzcGxpdChkZiwgZGYkcHJvX25hbWUpLCBmdW5jdGlvbih4KSB7CiAgICB0MCA8LSBkYXRhLmZyYW1lKG1hdHJpeChucm93ID0gMSwgbmNvbCA9IG5jb2woeCkpKQogICAgeHkgPC0gYyh3aGljaChuYW1lcyh4KSA9PSAibHlyX2JvdCIpLCB3aGljaChuYW1lcyh4KSA9PSAibHlyX3NvY19jbXR2IikpCiAgICB0MFsgLCB4eV0gPC0gMAogICAgbmFtZXModDApIDwtIG5hbWVzKHgpCiAgICB0MCRwcm9fbmFtZSA8LSB1bmlxdWUoeCRwcm9fbmFtZSkKICAgIHJldHVybihyYmluZCh0MCwgeCkpCiAgfSkKICByZXR1cm4oYmluZF9yb3dzKGxzKSkKfSkKCiMgMjAwOQpzcmEuMjAwOS5zcC5scyA8LSBsYXBwbHkoc3JhLjIwMDkubHMsIGZ1bmN0aW9uKGRmKSB7CiAgdDAgPC0gZGF0YS5mcmFtZShtYXRyaXgobnJvdyA9IDEsIG5jb2wgPSBuY29sKGRmKSkpCiAgeHkgPC0gYyh3aGljaChuYW1lcyhkZikgPT0gImx5cl9ib3QiKSwgd2hpY2gobmFtZXMoZGYpID09ICJseXJfc29jX2NtdHYiKSkKICB0MFsgLCB4eV0gPC0gMAogIG5hbWVzKHQwKSA8LSBuYW1lcyhkZikKICBuZXcgPC0gcmJpbmQodDAsIGRmKQogIHJldHVybihuZXcpCn0pCgojIDIwMTkKc3JhLjIwMTkuc3AubHMgPC0gbGFwcGx5KHNyYS4yMDE5LmxzLCBmdW5jdGlvbihkZikgewogIGxzIDwtIGxhcHBseShzcGxpdChkZiwgZGYkcHJvX25hbWUpLCBmdW5jdGlvbih4KSB7CiAgICB0MCA8LSBkYXRhLmZyYW1lKG1hdHJpeChucm93ID0gMSwgbmNvbCA9IG5jb2woeCkpKQogICAgeHkgPC0gYyh3aGljaChuYW1lcyh4KSA9PSAibHlyX2JvdCIpLCB3aGljaChuYW1lcyh4KSA9PSAibHlyX3NvY19jbXR2IikpCiAgICB0MFsgLCB4eV0gPC0gMAogICAgbmFtZXModDApIDwtIG5hbWVzKHgpCiAgICB0MCRwcm9fbmFtZSA8LSB1bmlxdWUoeCRwcm9fbmFtZSkKICAgIHJldHVybihyYmluZCh0MCwgeCkpCiAgfSkKICByZXR1cm4oYmluZF9yb3dzKGxzKSkKfSkKCiMjIHJ1biBzcGxpbmUKIyAyMDAxCnNyYS4yMDAxLm9jLnNwIDwtIGxhcHBseShzcmEuMjAwMS5zcC5scywgZnVuY3Rpb24oZGYpIHsKICBsYXBwbHkoc3BsaXQoZGYsIGRmJHByb19uYW1lKSwgZnVuY3Rpb24oeCkgewogICAgZGVwdGguc3BsaW5lKHhbLCBjKCJseXJfYm90IiwgImx5cl9zb2NfY210diIpXSkKICB9KQp9KQojIDIwMDkKc3JhLjIwMDkub2Muc3AgPC0gbGFwcGx5KHNyYS4yMDA5LnNwLmxzLCBmdW5jdGlvbih4KSB7CiAgZGVwdGguc3BsaW5lKHhbLCBjKCJseXJfYm90IiwgImx5cl9zb2NfY210diIpXSkKfSkKIyAyMDE5CnNyYS4yMDE5Lm9jLnNwIDwtIGxhcHBseShzcmEuMjAxOS5zcC5scywgZnVuY3Rpb24oZGYpIHsKICBsYXBwbHkoc3BsaXQoZGYsIGRmJHByb19uYW1lKSwgZnVuY3Rpb24oeCkgewogICAgZGVwdGguc3BsaW5lKHhbLCBjKCJseXJfYm90IiwgImx5cl9zb2NfY210diIpXSkKICB9KQp9KQpgYGAKCmBgYHtyIGN3dC1kMTRjLTAxLCBpbmNsdWRlID0gRkFMU0V9CiMjIGNhbGN1bGF0ZSBzdG9jayB3ZWlnaHRzCiMjIDIwMDEgZGVwdGhzCiMgb3JkZXIgJzAxIGRhdGEKc3JhLjIwMDEuc3VtLmxzIDwtIGxhcHBseShzcmEuMjAwMS5zdW0ubHMsIGZ1bmN0aW9uKGRmKSBkZltvcmRlcihkZiRseXJfYm90KSwgXSkKIyAyMDA5CmN3dC4wMS4wOSA8LSBsYXBwbHkoc2VxX2Fsb25nKHNyYS4yMDA5Lm9jLnNwKSwgZnVuY3Rpb24oaSkgewogIGQgPC0gc3JhLjIwMDEuc3VtLmxzW1tpXV1bWyJseXJfYm90Il1dICMgbWFwIG9udG8gJzAxIGRlcHRocwogIGMgPC0gdmVjdG9yKG1vZGUgPSAibGlzdCIsIGxlbmd0aCA9IGxlbmd0aChkKSkKICBmb3IoaiBpbiBzZXFfYWxvbmcoZCkpIHsKICAgIGlmKGogPT0gMSkgewogICAgICBjW1tqXV0gPC0gc3JhLjIwMDkub2Muc3BbW2ldXVsxOmRbal0sICJseXJfc29jIl0KICAgIH0gZWxzZSB7CiAgICAgIGNbW2pdXSA8LSBzcmEuMjAwOS5vYy5zcFtbaV1dWyhkW2otMV0rMSk6ZFtqXSwgImx5cl9zb2MiXSAKICAgIH0KICB9CiAgcmV0dXJuKHVubGlzdChsYXBwbHkoYywgZnVuY3Rpb24oeCkgeC9zdW0oeCkpKSkgIyByZXR1cm4gd2VpZ2h0cwp9KQpuYW1lcyhjd3QuMDEuMDkpIDwtIG5hbWVzKHNyYS4yMDA5Lm9jLnNwKQojIDIwMTkgKHNlY29uZCBsaXN0IGxldmVsIGZyb20gcHJvZmlsZSByZXBzKQpjd3QuMDEuMTkgPC0gbGFwcGx5KHNlcV9hbG9uZyhzcmEuMjAxOS5vYy5zcCksIGZ1bmN0aW9uKGkpIHsKICBsYXBwbHkoc3JhLjIwMTkub2Muc3BbW2ldXSwgZnVuY3Rpb24oZGYpIHsKICAgIGQgPC0gc3JhLjIwMDEuc3VtLmxzW1tpXV1bWyJseXJfYm90Il1dICMgbWFwIG9udG8gJzAxIGRlcHRocwogICAgYyA8LSB2ZWN0b3IobW9kZSA9ICJsaXN0IiwgbGVuZ3RoID0gbGVuZ3RoKGQpKQogICAgZm9yKGogaW4gc2VxX2Fsb25nKGQpKSB7CiAgICAgIGlmKGogPT0gMSkgewogICAgICAgIGNbW2pdXSA8LSBkZlsxOmRbal0sICJseXJfc29jIl0KICAgICAgfSBlbHNlIHsKICAgICAgICBjW1tqXV0gPC0gZGZbKGRbai0xXSsxKTpkW2pdLCAibHlyX3NvYyJdIAogICAgICB9CiAgICB9CiAgICByZXR1cm4odW5saXN0KGxhcHBseShjLCBmdW5jdGlvbih4KSB4L3N1bSh4KSkpKSAgIyByZXR1cm4gd2VpZ2h0cwogIH0pCn0pCm5hbWVzKGN3dC4wMS4xOSkgPC0gbmFtZXMoc3JhLjIwMTkub2Muc3ApCgoKIyMgY2FsY3VsYXRlIGZtX3d0cwojIyAnMDEgZGVwdGhzCiMgMjAxOQpmbS53dC4wMS4xOSA8LSBsYXBwbHkoc2VxX2Fsb25nKGN3dC4wMS4xOSksIGZ1bmN0aW9uKGkpIHsKICBsYXBwbHkoc2VxX2Fsb25nKGN3dC4wMS4xOVtbaV1dKSwgZnVuY3Rpb24oaikgewogICAgZGYgPC0gZGF0YS5mcmFtZShjd3QgPSBjd3QuMDEuMTlbW2ldXVtbal1dKQogICAgZGYkZm0gPC0gc3JhLjIwMTkuZm0uc3BbW2ldXVtbal1dW1sidmFyLjFjbSJdXVsxOmxlbmd0aChjd3QuMDEuMTlbW2ldXVtbal1dKV0KICAgIGRmJGZtX3d0IDwtIGRmJGZtICogZGYkY3d0CiAgcmV0dXJuKGRmKQogIH0pCn0pIApuYW1lcyhmbS53dC4wMS4xOSkgPC0gbmFtZXMoY3d0LjAxLjE5KQojIDIwMDkKZm0ud3QuMDEuMDkgPC0gbGFwcGx5KHNlcV9hbG9uZyhjd3QuMDEuMDkpLCBmdW5jdGlvbihpKSB7CiAgZGYgPC0gZGF0YS5mcmFtZShjd3QgPSBjd3QuMDEuMDlbW2ldXSkKICBkZiRmbSA8LSBzcmEuMjAwOS5mbS5zcFtbaV1dW1sidmFyLjFjbSJdXVsxOmxlbmd0aChjd3QuMDEuMDlbW2ldXSldCiAgZGYkZm1fd3QgPC0gZGYkZm0gKiBkZiRjd3QKICByZXR1cm4oZGYpCn0pCm5hbWVzKGZtLnd0LjAxLjA5KSA8LSBuYW1lcyhjd3QuMDEuMDkpCgoKIyMgY2FsY3VsYXRlIHdlaWdodGVkIGF2ZXJhZ2Ugb2YgZm0gZm9yIGVhY2ggaW50ZXJ2YWwKIyMgJzAxIGRlcHRocwojIDIwMDkKc3JhLjAxLjA5LmxzIDwtIGxhcHBseShzZXFfYWxvbmcoc3JhLjIwMDEuc3VtLmxzKSwgZnVuY3Rpb24oaSkgewogIGQgPC0gc3JhLjIwMDEuc3VtLmxzW1tpXV1bWyJseXJfYm90Il1dCiAgZiA8LSB2ZWN0b3IobW9kZSA9ICJsaXN0IiwgbGVuZ3RoID0gbGVuZ3RoKGQpKQogIGZvcihqIGluIHNlcV9hbG9uZyhkKSkgewogICAgaWYoaiA9PSAxKSB7CiAgICAgIGZbW2pdXSA8LSBzdW0oZm0ud3QuMDEuMDlbW2ldXVsxOmRbal0sICJmbV93dCJdKQogICAgfSBlbHNlIHsKICAgICAgZltbal1dIDwtIHN1bShmbS53dC4wMS4wOVtbaV1dWyhkW2otMV0rMSk6ZFtqXSwgImZtX3d0Il0pCiAgICB9CiAgfQogIHJldHVybihjYmluZChzcmEuMjAwMS5zdW0ubHNbW2ldXSwgZm1fMDkgPSB1bmxpc3QoZikpKQp9KQpuYW1lcyhzcmEuMDEuMDkubHMpIDwtIG5hbWVzKGZtLnd0LjAxLjA5KQojIDIwMTkKc3JhLjAxLjE5LmxzIDwtIGZtLnd0LjAxLjE5ICMgaW5pdGlhbGl6ZSBsaXN0IHdpdGggZm0gd3Qgc3RydWN0dXJlCnNyYS4wMS4xOS5scyA8LSBsYXBwbHkoc2VxX2Fsb25nKHNyYS4yMDAxLnN1bS5scyksIGZ1bmN0aW9uKGkpIHsKICBzcmEuMDEuMTkubHNbW2ldXSA8LSBsYXBwbHkoc2VxX2Fsb25nKGZtLnd0LjAxLjE5W1tpXV0pLCBmdW5jdGlvbih4KSB7CiAgICBkIDwtIHNyYS4yMDAxLnN1bS5sc1tbaV1dW1sibHlyX2JvdCJdXQogICAgZiA8LSB2ZWN0b3IobW9kZSA9ICJsaXN0IiwgbGVuZ3RoID0gbGVuZ3RoKGQpKQogICAgZm9yKGogaW4gc2VxX2Fsb25nKGQpKSB7CiAgICAgIGlmKGogPT0gMSkgewogICAgICAgIGZbW2pdXSA8LSBzdW0oZm0ud3QuMDEuMTlbW2ldXVtbeF1dWzE6ZFtqXSwgImZtX3d0Il0pCiAgICAgIH0gZWxzZSB7CiAgICAgICAgZltbal1dIDwtIHN1bShmbS53dC4wMS4xOVtbaV1dW1t4XV1bKGRbai0xXSsxKTpkW2pdLCAiZm1fd3QiXSkKICAgICAgfQogICAgfQogICAgcmV0dXJuKHVubGlzdChmKSkgCiAgfSkKICBmbSA8LSBsYXBwbHkoc2VxX2Fsb25nKHNyYS4wMS4xOS5sc1tbaV1dW1sxXV0pLCBmdW5jdGlvbih6KSB7CiAgICBkYXRhLmZyYW1lKGZtXzE5X21lYW4gPSBtZWFuKHNhcHBseShzcmEuMDEuMTkubHNbW2ldXSwgIlsiLCB6KSwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgICAgZm1fMTlfc2QgPSBzZChzYXBwbHkoc3JhLjAxLjE5LmxzW1tpXV0sICJbIiwgeiksIG5hLnJtID0gVFJVRSkpCiAgICB9KQogIGZtIDwtIGJpbmRfcm93cyhmbSkKICByZXR1cm4oZm0pCn0pCnNyYS4wMS4wOS4xOS5scyA8LSBsYXBwbHkoc2VxX2Fsb25nKHNyYS4wMS4wOS5scyksIGZ1bmN0aW9uKGkpIHsKICBkYXRhLmZyYW1lKHNyYS4wMS4wOS5sc1tbaV1dLCBzcmEuMDEuMTkubHNbW2ldXSkKfSkKbmFtZXMoc3JhLjAxLjA5LjE5LmxzKSA8LSBuYW1lcyhzcmEuMDEuMDkubHMpCgojIyBjcmVhdGUgdGlkeSBjb21iaW5lZCAnMDEsICcwOSwgJzE5IGRhdGEgZnJhbWUKbm1zIDwtIGMoIlBNIiwgIkVDTyIsICJQTWVjbyIsICJseXJfdG9wIiwgImx5cl9ib3QiLCAiZm0iLCAiZm1fc2QiKQpzcmEuMDEuMDkuMTkuZGYgPC0gYmluZF9yb3dzKHNyYS4wMS4wOS4xOS5scykKc3JhLjAxLjA5LjE5IDwtIHNyYS4wMS4wOS4xOS5kZlssIG5tc10Kc3JhLjAxLjA5LjE5IDwtIHJiaW5kKGNiaW5kKHNyYS4wMS4wOS4xOSwgWWVhciA9IGFzLmNoYXJhY3RlcigyMDAxKSksCiAgICAgICAgICAgICAgICAgICAgICBkYXRhLmZyYW1lKHNyYS4wMS4wOS4xOVssIG5tc1sxOjVdXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm0gPSBzcmEuMDEuMDkuMTkuZGYkZm1fMDksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZtX3NkID0gTkEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFllYXIgPSBhcy5jaGFyYWN0ZXIoMjAwOSkpLAogICAgICAgICAgICAgICAgICAgICAgZGF0YS5mcmFtZShzcmEuMDEuMDkuMTlbLCBubXNbMTo1XV0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZtID0gc3JhLjAxLjA5LjE5LmRmJGZtXzE5X21lYW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZtX3NkID0gc3JhLjAxLjA5LjE5LmRmJGZtXzE5X3NkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZZWFyID0gYXMuY2hhcmFjdGVyKDIwMTkpKSkKCiMgY2FsYyBkMTRjIGZyb20gZm0Kc3JhLjAxLjA5LjE5JGQxNGMgPC0gY2FsY18xNGMoc3JhLjAxLjA5LjE5JGZtLCBhcy5udW1lcmljKGFzLmNoYXJhY3RlcihzcmEuMDEuMDkuMTkkWWVhcikpKQpzcmEuMDEuMDkuMTkkZDE0Y19zZCA8LSBhYnMoc3JhLjAxLjA5LjE5JGQxNGMgLSBjYWxjXzE0YyhzcmEuMDEuMDkuMTkkZm0gKyBzcmEuMDEuMDkuMTkkZm1fc2QsIGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKHNyYS4wMS4wOS4xOSRZZWFyKSkpKQpgYGAKCmBgYHtyIGN3dC1kMTRjLTE5LCBpbmNsdWRlID0gRkFMU0V9CiMjIGNhbGN1bGF0ZSBzdG9jayB3ZWlnaHRzCiMjIDIwMTkgZGVwdGhzCiMgMjAwMQpjd3QuMTkuMDEgPC0gbGFwcGx5KHNlcV9hbG9uZyhzcmEuMjAwMS5vYy5zcCksIGZ1bmN0aW9uKGkpIHsKICBsYXBwbHkoc3JhLjIwMDEub2Muc3BbW2ldXSwgZnVuY3Rpb24oZGYpIHsKICAgIGQgPC0gc3JhLjIwMTkuc3VtLmxzW1tpXV1bWyJseXJfYm90Il1dCiAgICBjIDwtIHZlY3Rvcihtb2RlID0gImxpc3QiLCBsZW5ndGggPSBsZW5ndGgoZCkpCiAgICBmb3IoaiBpbiBzZXFfYWxvbmcoZCkpIHsKICAgICAgaWYoaiA9PSAxKSB7CiAgICAgICAgY1tbal1dIDwtIGRmWzE6ZFtqXSwgImx5cl9zb2MiXQogICAgICB9IGVsc2UgewogICAgICAgIGNbW2pdXSA8LSBkZlsoZFtqLTFdKzEpOmRbal0sICJseXJfc29jIl0gCiAgICAgIH0KICAgIH0KICAgIHJldHVybih1bmxpc3QobGFwcGx5KGMsIGZ1bmN0aW9uKHgpIHgvc3VtKHgpKSkpCiAgfSkKfSkKbmFtZXMoY3d0LjE5LjAxKSA8LSBuYW1lcyhzcmEuMjAwMS5vYy5zcCkKIyAyMDA5CmN3dC4xOS4wOSA8LSBsYXBwbHkoc2VxX2Fsb25nKHNyYS4yMDA5Lm9jLnNwKSwgZnVuY3Rpb24oaSkgewogIGQgPC0gc3JhLjIwMTkuc3VtLmxzW1tpXV1bWyJseXJfYm90Il1dCiAgYyA8LSB2ZWN0b3IobW9kZSA9ICJsaXN0IiwgbGVuZ3RoID0gbGVuZ3RoKGQpKQogIGZvcihqIGluIHNlcV9hbG9uZyhkKSkgewogICAgaWYoaiA9PSAxKSB7CiAgICAgIGNbW2pdXSA8LSBzcmEuMjAwOS5vYy5zcFtbaV1dWzE6ZFtqXSwgImx5cl9zb2MiXQogICAgfSBlbHNlIHsKICAgICAgY1tbal1dIDwtIHNyYS4yMDA5Lm9jLnNwW1tpXV1bKGRbai0xXSsxKTpkW2pdLCAibHlyX3NvYyJdIAogICAgfQogIH0KICByZXR1cm4odW5saXN0KGxhcHBseShjLCBmdW5jdGlvbih4KSB4L3N1bSh4KSkpKQp9KQpuYW1lcyhjd3QuMTkuMDkpIDwtIG5hbWVzKHNyYS4yMDA5Lm9jLnNwKQoKIyMgY2FsY3VsYXRlIGZtX3d0cwojIyAnMTkgZGVwdGhzCiMgMjAwMQpmbS53dC4xOS4wMSA8LSBsYXBwbHkoc2VxX2Fsb25nKGN3dC4xOS4wMSksIGZ1bmN0aW9uKGkpIHsKICBsYXBwbHkoc2VxX2Fsb25nKGN3dC4xOS4wMVtbaV1dKSwgZnVuY3Rpb24oaikgewogICAgZGYgPC0gZGF0YS5mcmFtZShjd3QgPSBjd3QuMTkuMDFbW2ldXVtbal1dKQogICAgZGYkZm0gPC0gc3JhLjIwMDEuZm0uc3BbW2ldXVtbal1dW1sidmFyLjFjbSJdXVsxOmxlbmd0aChjd3QuMTkuMDFbW2ldXVtbal1dKV0KICAgICMgbGluZWFyIGV4dHJhcG9sYXRpb24gZm9yIGZpbGxpbmcgMjAtMzBjbSBmbSBkYXRhCiAgICBmbV8xXzMwIDwtIGRmJGZtWzE6MzBdICMgMC0zMGNtIGZtCiAgICBpZihsZW5ndGgod2hpY2goaXMubmEoZm1fMV8zMCkpKSA+IDApIHsKICAgICBpeCA8LSB3aGljaChpcy5uYShmbV8xXzMwKSkKICAgICBpeC5taW4gPC0gbWluKGl4KSAjIGZpcnN0IGlzLm5hKGZtKQogICAgIG0gPC0gZm1fMV8zMFtpeC5taW4tMV0tZm1fMV8zMFtpeC5taW4tMl0gIyBzbG9wZSBhdCBsYXN0IHR3byBtZWFzdXJlbWVudCBwb2ludHMKICAgICBmb3IoaSBpbiBpeC5taW46MzApIHsKICAgICAgZm1fMV8zMFtpXSA8LSBmbV8xXzMwW2kgLSAxXSArIG0gCiAgICAgfQogICAgIGRmJGZtWzE6MzBdIDwtIGZtXzFfMzAgCiAgICB9CiAgICBkZiRmbV93dCA8LSBkZiRmbSAqIGRmJGN3dAogIHJldHVybihkZikKICB9KQp9KQpuYW1lcyhmbS53dC4xOS4wMSkgPC0gbmFtZXMoY3d0LjE5LjAxKQojIDIwMDkKZm0ud3QuMTkuMDkgPC0gbGFwcGx5KHNlcV9hbG9uZyhjd3QuMTkuMDkpLCBmdW5jdGlvbihpKSB7CiAgZGYgPC0gZGF0YS5mcmFtZShjd3QgPSBjd3QuMTkuMDlbW2ldXSkKICBkZiRmbSA8LSBzcmEuMjAwOS5mbS5zcFtbaV1dW1sidmFyLjFjbSJdXVsxOmxlbmd0aChjd3QuMTkuMDlbW2ldXSldCiAgZGYkZm1fd3QgPC0gZGYkZm0gKiBkZiRjd3QKICByZXR1cm4oZGYpCn0pCm5hbWVzKGZtLnd0LjE5LjA5KSA8LSBuYW1lcyhjd3QuMTkuMDkpCgoKIyMgY2FsY3VsYXRlIHdlaWdodGVkIGF2ZXJhZ2Ugb2YgZm0gZm9yIGVhY2ggaW50ZXJ2YWwKIyMgJzE5IGRlcHRocwojIDIwMDEKIyBjYWxjdWxhdGUgd2VpZ2h0ZWQgc3BsaW5lIHZhbHVlcyBmb3IgZWFjaCBwcm9maWxlIHJlcApzcmEuMTkuMDEucmVwLmxzIDwtIGZtLnd0LjE5LjAxCnNyYS4xOS4wMS5yZXAubHMgPC0gbGFwcGx5KHNlcV9hbG9uZyhzcmEuMjAxOS5zdW0ubHMpLCBmdW5jdGlvbihpKSB7CiAgc3JhLjE5LjAxLnJlcC5sc1tbaV1dIDwtIGxhcHBseShzZXFfYWxvbmcoZm0ud3QuMTkuMDFbW2ldXSksIGZ1bmN0aW9uKHgpIHsKICAgIGQgPC0gc3JhLjIwMTkuc3VtLmxzW1tpXV1bWyJseXJfYm90Il1dCiAgICBmIDwtIHZlY3Rvcihtb2RlID0gImxpc3QiLCBsZW5ndGggPSBsZW5ndGgoZCkpCiAgICBmb3IoaiBpbiBzZXFfYWxvbmcoZCkpIHsKICAgICAgaWYoaiA9PSAxKSB7CiAgICAgICAgZltbal1dIDwtIHN1bShmbS53dC4xOS4wMVtbaV1dW1t4XV1bMTpkW2pdLCAiZm1fd3QiXSkKICAgICAgfSBlbHNlIHsKICAgICAgICBmW1tqXV0gPC0gc3VtKGZtLnd0LjE5LjAxW1tpXV1bW3hdXVsoZFtqLTFdKzEpOmRbal0sICJmbV93dCJdKQogICAgICB9CiAgICB9CiAgICByZXR1cm4odW5saXN0KGYpKSAKICB9KX0pCnNyYS4xOS4wMS5yZXAubHMgPC0gbGFwcGx5KHNlcV9hbG9uZyhzcmEuMTkuMDEucmVwLmxzKSwgZnVuY3Rpb24oaSkgewogIG5hbWVzKHNyYS4xOS4wMS5yZXAubHNbW2ldXSkgPC0gbmFtZXMoY3d0LjE5LjAxW1tpXV0pCiAgcmV0dXJuKHNyYS4xOS4wMS5yZXAubHNbW2ldXSkKfSkKbmFtZXMoc3JhLjE5LjAxLnJlcC5scykgPC0gbmFtZXMoZm0ud3QuMTkuMDEpCgojIGF2ZXJhZ2UgcmVwcwpzcmEuMTkuMDEubHMgPC0gbGFwcGx5KHNlcV9hbG9uZyhzcmEuMjAxOS5zdW0ubHMpLCBmdW5jdGlvbihpKSB7CiAgZm0gPC0gbGFwcGx5KHNlcV9hbG9uZyhzcmEuMTkuMDEucmVwLmxzW1tpXV1bWzFdXSksIGZ1bmN0aW9uKHopIHsKICAgIGRhdGEuZnJhbWUoZm1fMDFfbWVhbiA9IG1lYW4oc2FwcGx5KHNyYS4xOS4wMS5yZXAubHNbW2ldXSwgIlsiLCB6KSwgbmEucm0gPSBUUlVFKSwKICAgICAgICAgICAgICAgZm1fMDFfc2QgPSBzZChzYXBwbHkoc3JhLjE5LjAxLnJlcC5sc1tbaV1dLCAiWyIsIHopLCBuYS5ybSA9IFRSVUUpKQogICAgfSkKICByZXR1cm4oYmluZF9yb3dzKGZtKSkKfSkKbmFtZXMoc3JhLjE5LjAxLmxzKSA8LSBuYW1lcyhmbS53dC4xOS4wMSkKCiMgMjAwOQpzcmEuMTkuMDkubHMgPC0gbGFwcGx5KHNlcV9hbG9uZyhzcmEuMjAxOS5zdW0ubHMpLCBmdW5jdGlvbihpKSB7CiAgZCA8LSBzcmEuMjAxOS5zdW0ubHNbW2ldXVtbImx5cl9ib3QiXV0KICBmIDwtIHZlY3Rvcihtb2RlID0gImxpc3QiLCBsZW5ndGggPSBsZW5ndGgoZCkpCiAgZm9yKGogaW4gc2VxX2Fsb25nKGQpKSB7CiAgICBpZihqID09IDEpIHsKICAgICAgZltbal1dIDwtIHN1bShmbS53dC4xOS4wOVtbaV1dWzE6ZFtqXSwgImZtX3d0Il0pCiAgICB9IGVsc2UgewogICAgICBmW1tqXV0gPC0gc3VtKGZtLnd0LjE5LjA5W1tpXV1bKGRbai0xXSsxKTpkW2pdLCAiZm1fd3QiXSkKICAgIH0KICB9CiAgcmV0dXJuKGNiaW5kKHNyYS4yMDE5LnN1bS5sc1tbaV1dLCBmbV8wOSA9IHVubGlzdChmKSkpCn0pCm5hbWVzKHNyYS4xOS4wOS5scykgPC0gbmFtZXMoc3JhLjE5LjAxLmxzKQoKIyBjb21iaW5lCnNyYS4xOS4wMS4wOS5scyA8LSBsYXBwbHkoc2VxX2Fsb25nKHNyYS4xOS4wMS5scyksIGZ1bmN0aW9uKGkpIHsKICBkYXRhLmZyYW1lKHNyYS4xOS4wMS5sc1tbaV1dLCBzcmEuMTkuMDkubHNbW2ldXSkKfSkKbmFtZXMoc3JhLjE5LjAxLjA5LmxzKSA8LSBuYW1lcyhzcmEuMTkuMDEubHMpCgojIyBjcmVhdGUgdGlkeSBjb21iaW5lZCAnMDEsICcwOSwgJzE5IGRhdGEgZnJhbWUKc3JhLjE5LjAxLjA5LmRmIDwtIGJpbmRfcm93cyhzcmEuMTkuMDEuMDkubHMpCnNyYS4xOS4wMS4wOSA8LSBzcmEuMTkuMDEuMDkuZGZbLCBubXNdCnNyYS4xOS4wMS4wOSA8LSByYmluZChkYXRhLmZyYW1lKHNyYS4xOS4wMS4wOVssIG5tc1sxOjVdXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm0gPSBzcmEuMTkuMDEuMDkuZGYkZm1fMDFfbWVhbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm1fc2QgPSBzcmEuMTkuMDEuMDkuZGYkZm1fMDFfc2QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFllYXIgPSBhcy5jaGFyYWN0ZXIoMjAwMSkpLAogICAgICAgICAgICAgICAgICAgICBkYXRhLmZyYW1lKHNyYS4xOS4wMS4wOVssIG5tc1sxOjVdXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbSA9IHNyYS4xOS4wMS4wOS5kZiRmbV8wOSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbV9zZCA9IE5BLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFllYXIgPSBhcy5jaGFyYWN0ZXIoMjAwOSkpLAogICAgICAgICAgICAgICAgICAgICBjYmluZChzcmEuMTkuMDEuMDksIFllYXIgPSBhcy5jaGFyYWN0ZXIoMjAxOSkpKQoKIyBjYWxjIGQxNGMgZnJvbSBmbQpzcmEuMTkuMDEuMDkkZDE0YyA8LSBjYWxjXzE0YyhzcmEuMTkuMDEuMDkkZm0sIGFzLm51bWVyaWMoYXMuY2hhcmFjdGVyKHNyYS4xOS4wMS4wOSRZZWFyKSkpCnNyYS4xOS4wMS4wOSRkMTRjX3NkIDwtIGFicyhzcmEuMTkuMDEuMDkkZDE0YyAtIGNhbGNfMTRjKHNyYS4xOS4wMS4wOSRmbSArIHNyYS4xOS4wMS4wOSRmbV9zZCwgYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoc3JhLjE5LjAxLjA5JFllYXIpKSkpCmBgYAoKYGBge3IgcGxvdC0wMS0wOS0xOS0xNGMtcHJvZmlsZXN9CmZpZy5uIDwtIGZpZy5uICsgMQpzcmEuMDEuMDkuMTkgJT4lCiAgbXV0YXRlKFBNZWNvX3llYXIgPSBwYXN0ZTAoUE1lY28sIFllYXIpLAogICAgICAgICBlY28gPSBmYWN0b3IoaWZlbHNlKEVDTyA9PSAicHAiLCAid2FybSIsCiAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoRUNPID09ICJ3ZiIsICJjb29sIiwgImNvbGQiKSksCiAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJ3YXJtIiwgImNvb2wiLCAiY29sZCIpKSwKICAgICAgICAgZDE0Y191ID0gZDE0YyArIGQxNGNfc2QsCiAgICAgICAgIGQxNGNfbCA9IGQxNGMgLSBkMTRjX3NkLAogICAgICAgICBwbSA9IGlmZWxzZShQTSA9PSAiQU4iLCAiYW5kZXNpdGUiLAogICAgICAgICAgICAgICAgICAgICBpZmVsc2UoUE0gPT0gIkJTIiwgImJhc2FsdCIsICJncmFuaXRlIikpKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKGQxNGMsIGx5cl9ib3QsIGNvbG9yID0gcG0sIHNoYXBlID0gZWNvLCBsaW5ldHlwZSA9IFllYXIsIGdyb3VwID0gUE1lY29feWVhcikpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgKwogIGdlb21fcG9pbnQoYWVzKGFscGhhID0gWWVhciksIHNpemUgPSAzKSArCiAgZ2VvbV9wYXRoKGFlcyhsaW5ldHlwZSA9IFllYXIpKSArCiAgZ2VvbV9lcnJvcmJhcmgoCiAgICBhZXMoeG1pbiA9IGQxNGNfbCwgCiAgICAgICAgeG1heCA9IGQxNGNfdSwKICAgICAgICBjb2xvciA9IHBtKSwgCiAgICBoZWlnaHQgPSAxLjUpICsKICBzY2FsZV95X3JldmVyc2UoKSArCiAgc2NhbGVfeF9jb250aW51b3VzKCkgKyAgICAKICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICJQYXJlbnQgbWF0ZXJpYWwiLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJhbmRlc2l0ZSIgPSAiYmx1ZSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYXNhbHQiID0gInJlZCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJncmFuaXRlIiA9ICJkYXJrZ3JheSIpKSArCiAgc2NhbGVfc2hhcGVfbWFudWFsKG5hbWUgPSAiRWNvc3lzdGVtIiwKICAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygid2FybSIgPSAxNSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvb2wiID0gMTYsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb2xkIiA9IDE3KSkgKwogIHNjYWxlX2FscGhhX21hbnVhbCh2YWx1ZXMgPSBjKCIyMDAxIiA9IDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjIwMDkiID0gMC42LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIyMDE5IiA9IDAuMykpICsKICBmYWNldF9ncmlkKHJvd3MgPSB2YXJzKGVjbyksIGNvbHMgPSB2YXJzKHBtKSkgKwogIHhsYWIoZXhwcmVzc2lvbihEZWx0YSonJ14xNConQyAo4oCwKScpKSArCiAgeWxhYigiRGVwdGggKGNtKSIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpKQpgYGAKPioqRmlnLiBgciB7ZmlnLm59YC4gVGltZSBzZXJpZXMgb2YgJFxEZWx0YSReMTReQyBieSBkZXB0aCAoMjAwMSwgMjAwOSwgMjAxOSkqKgoKPipDYXB0aW9uOiogUG9pbnRzIGZvciAyMDAxIHNhbXBsZXMgc2hvdyB0aGUgbWVhbiAkXERlbHRhJF4xNF5DIHZhbHVlcyBhdCB0aGUgbWVhc3VyZWQgZGVwdGhzLiBQb2ludHMgZm9yIDIwMDkgYW5kIDIwMTkgc2FtcGxlcyBhcmUgc3BsaW5lLWZpdHRlZCBlc3RpbWF0ZXMgb2YgJFxEZWx0YSReMTReQyBwcmVkaWN0ZWQgZm9yIHRoZSBzYW1lIGRlcHRoIGludGVydmFscyBhcyBtZWFzdXJlZCBpbiAyMDAxLiBFcnJvciBiYXJzIHNob3cgwrEgMSBzdGFuZGFyZCBkZXZpYXRpb24gb2YgdGhlIG1lYW4gb2YgdGhyZWUgcmVwbGljYXRlIHByb2ZpbGVzIGZvciAyMDAxIGFuZCAyMDE5IHNhbXBsZXMgKG9ubHkgYSBzaW5nbGUgcHJvZmlsZSB3YXMgYW5hbHl6ZWQgaW4gMjAwOSkuIAoKYGBge3IgcGxvdC0xOS0wMS0wOS0xNGMtcHJvZmlsZXN9CmZpZy5uIDwtIGZpZy5uICsgMQpzcmEuMTkuMDEuMDkgJT4lCiAgbXV0YXRlKFBNZWNvX3llYXIgPSBwYXN0ZTAoUE1lY28sIFllYXIpLAogICAgICAgICBlY28gPSBmYWN0b3IoaWZlbHNlKEVDTyA9PSAicHAiLCAid2FybSIsCiAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UoRUNPID09ICJ3ZiIsICJjb29sIiwgImNvbGQiKSksCiAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKCJ3YXJtIiwgImNvb2wiLCAiY29sZCIpKSwKICAgICAgICAgZDE0Y191ID0gZDE0YyArIGQxNGNfc2QsCiAgICAgICAgIGQxNGNfbCA9IGQxNGMgLSBkMTRjX3NkLAogICAgICAgICBwbSA9IGlmZWxzZShQTSA9PSAiQU4iLCAiYW5kZXNpdGUiLAogICAgICAgICAgICAgICAgICAgICBpZmVsc2UoUE0gPT0gIkJTIiwgImJhc2FsdCIsICJncmFuaXRlIikpKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKGQxNGMsIGx5cl9ib3QsIGNvbG9yID0gcG0sIHNoYXBlID0gZWNvLCBsaW5ldHlwZSA9IFllYXIsIGdyb3VwID0gUE1lY29feWVhcikpICsKICBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQgPSAwKSArCiAgZ2VvbV9obGluZSh5aW50ZXJjZXB0ID0gMCkgKwogIGdlb21fcG9pbnQoYWVzKGFscGhhID0gWWVhciksIHNpemUgPSAzKSArCiAgZ2VvbV9wYXRoKGFlcyhsaW5ldHlwZSA9IFllYXIpKSArCiAgZ2VvbV9lcnJvcmJhcmgoCiAgICBhZXMoeG1pbiA9IGQxNGNfbCwgCiAgICAgICAgeG1heCA9IGQxNGNfdSwKICAgICAgICBjb2xvciA9IHBtKSwgCiAgICBoZWlnaHQgPSAxLjUpICsKICBzY2FsZV95X3JldmVyc2UobGltaXRzID0gYygzMCwgMCkpICsKICBzY2FsZV94X2NvbnRpbnVvdXMoKSArICAgIAogIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gIlBhcmVudCBtYXRlcmlhbCIsCiAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoImFuZGVzaXRlIiA9ICJibHVlIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJhc2FsdCIgPSAicmVkIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdyYW5pdGUiID0gImRhcmtncmF5IikpICsKICBzY2FsZV9zaGFwZV9tYW51YWwobmFtZSA9ICJFY29zeXN0ZW0iLAogICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJ3YXJtIiA9IDE1LCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29vbCIgPSAxNiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbGQiID0gMTcpKSArCiAgc2NhbGVfYWxwaGFfbWFudWFsKHZhbHVlcyA9IGMoIjIwMDEiID0gMSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiMjAwOSIgPSAwLjYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjIwMTkiID0gMC4zKSkgKwogIGZhY2V0X2dyaWQocm93cyA9IHZhcnMoZWNvKSwgY29scyA9IHZhcnMocG0pKSArCiAgeGxhYihleHByZXNzaW9uKERlbHRhKicnXjE0KidDICjigLApJykpICsKICB5bGFiKCJEZXB0aCAoY20pIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpCmBgYAo+KipGaWcuIGByIHtmaWcubn1gLiBUaW1lIHNlcmllcyBvZiAkXERlbHRhJF4xNF5DIGJ5IGRlcHRoIChzcGxpbmVkIHRvIDIwMTkgZGVwdGhzKSoqCgo+KkNhcHRpb246KiBQb2ludHMgZm9yIDIwMTkgc2FtcGxlcyBzaG93IHRoZSBtZWFuICRcRGVsdGEkXjE0XkMgdmFsdWVzIGF0IHRoZSBtZWFzdXJlZCBkZXB0aHMuIFBvaW50cyBmb3IgMjAwMSBhbmQgMjAwOSBzYW1wbGVzIGFyZSBzcGxpbmUtZml0dGVkIGVzdGltYXRlcyBvZiAkXERlbHRhJF4xNF5DIHByZWRpY3RlZCBmb3IgdGhlIHNhbWUgZGVwdGggaW50ZXJ2YWxzIGFzIG1lYXN1cmVkIGluIDIwMTkuIEVycm9yIGJhcnMgc2hvdyDCsSAxIHN0YW5kYXJkIGRldmlhdGlvbiBvZiB0aGUgbWVhbiBvZiB0aHJlZSByZXBsaWNhdGUgcHJvZmlsZXMgZm9yIDIwMDEgYW5kIDIwMTkgc2FtcGxlcyAob25seSBhIHNpbmdsZSBwcm9maWxlIHdhcyBhbmFseXplZCBpbiAyMDA5KS4gCj4qTkI6IE9ubHkgdHdvIGRlcHRoIGludGVydmFscyB3ZXJlIG1lYXN1cmVkIGF0IHRoZSBjb29sIGFuZCBjb2xkIGFuZGVzaXRlIHNpdGVzIChtYXggZGVwdGggb2YgMjcgYW5kIDI4IGNtLCByZXNwZWN0aXZlbHkpLCBzbyBsaW5lYXIgZXh0cmFwb2xhdGlvbiAodXNpbmcgdGhlIHNsb3BlIG9mIHRoZSBsYXN0IDFjbSBzcGxpbmUtZml0dGVkIGRlcHRoIGluY3JlbWVudCkgd2FzIHVzZWQgdG8gZXh0ZW5kIHRoZSBwcm9maWxlcyB0byAzMCBjbS4qCgojIyBJbml0aWFsIG1vZGVsaW5nCgpUaGUgZ29hbCBvZiB0aGlzIG1vZGVsaW5nIGV4ZXJjaXNlIGlzIHRvIHNlZSBob3cgcGFyZW50IG1hdGVyaWFsIGFuZCBjbGltYXRlL2Vjb3N5c3RlbSBhZmZlY3QgZXN0aW1hdGVzIG9mIHNvaWwgY2FyYm9uIGFnZXMgYW5kIHRyYW5zaXQgdGltZXMuIEJ1bGsgc29pbCBeMTReQyBvYnNlcnZhdGlvbnMgZnJvbSAyMDAxLCAyMDA5LCBhbmQgMjAxOSB3aWxsIGJlIHVzZWQgdG8gY29uc3RyYWluIHRoZSBjYXJib24gbW9kZWxzLCBhcyB3ZWxsIGFzIG9ic2VydmF0aW9ucyBvZiBeMTReQy1DT34yfiBmcm9tIGxhYm9yYXRvcnkgc29pbCBpbmN1YmF0aW9ucyBvZiBzb2lscyBjb2xsZWN0ZWQgaW4gMjAwMSBhbmQgMjAxOS4gUHJldmlvdXMgd29yayBoYXMgaW5kaWNhdGVkIHRoYXQgdGhlIGNhcmJvbiBzdG9ja3MgYXQgdGhlc2Ugc2l0ZXMgaXMgbGlrZWx5IGF0IGVxdWlsaWJyaXVtLCBzbyB3ZSB3aWxsIGFwcGx5IHRoZSBzdGVhZHktc3RhdGUgYXNzdW1wdGlvbiB0byB0aGUgbW9kZWxpbmcuCgojIyMgVHdvLXBvb2wgbW9kZWxzCgpPbmUgcG9vbCBtb2RlbHMgaGF2ZSBiZWVuIHNob3duIHJlcGVhdGVkbHkgdG8gYmUgaW5hZGVxdWF0ZSBmb3IgZGVzY3JpYmluZyBzb2lsIGNhcmJvbiBkeW5hbWljcy4gSG93ZXZlciwgYXMgc2ltcGxlIG1vZGVscyBhcmUgZWFzaWVyIHRvIGNvbnN0cmFpbiwgd2Ugd2lsbCBzdGFydCB3aXRoIGEgdHdvLXBvb2wgcGFyYWxsZWwgYW5kIHR3by1zZXJpZXMgbW9kZWxzLCBhcyB0aGVzZSBhcmUgdGhlIHNpbXBsZXN0IG1vZGVsIHN5c3RlbSBiZXlvbmQgdGhlIHNpbmdsZSBwb29sIGFwcHJvYWNoLiAKClRoZSB0d28tcG9vbCBwYXJhbGxlbCBtb2RlbCByZXF1aXJlcyB0aGUgZm9sbG93aW5nIHBhcmFtZXRlcnM6CiogZGVjb21wb3NpdGlvbiBjb25zdGFudHMgZm9yIGVhY2ggcG9vbCAoKmsqfjF+LCAqayp+Mn4pCiogaW5wdXQgcGFydGl0aW9uaW5nIGNvZWZmaWNpZW50ICgkXGdhbW1hJCkKKiBzdGVhZHktc3RhdGUgY2FyYm9uIHN0b2NrcyAoQykKKiBpbnB1dHMgKEkpCiogaW5pdGlhbCB2YWx1ZXMgb2YgXjE0XkMKClRoZSB0d28tcG9vbCBzZXJpZXMgbW9kZWwgcmVxdWlyZXMgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzOgoqIGRlY29tcG9zaXRpb24gY29uc3RhbnRzIGZvciBlYWNoIHBvb2wgKCprKn4xfiwgKmsqfjJ+KQoqIHRyYW5zZmVyIGNvZWZmaWNpZW50ICgkXGFscGhhJCkKKiBzdGVhZHktc3RhdGUgY2FyYm9uIHN0b2NrcyAoQykKKiBpbnB1dHMgKEkpCiogaW5pdGlhbCB2YWx1ZXMgb2YgXjE0XkMKCkRlY29tcG9zaXRpb24gcmF0ZXMgKCprKikgYXJlIHJlbGF0ZWQgdG8gdGhlIGFtb3VudCBvZiBeMTReQyBpbiBhIHByZS1ib21iIHN5c3RlbSAoZnJhY3Rpb24gbW9kZXJuLCAqRiopIGF0IHN0ZWFkeS1zdGF0ZSBieSB0aGUgZm9sbG93aW5nIGVxdWF0aW9ucyAoY2YuIFNjaHV1ciwgRHJ1ZmZsZSwgYW5kIFRydW1ib3JlLCAyMDE2KToKPioqRXEuIDEqKgoKJCRGID0gXGZyYWN7a317ayArIFxsYW1iZGF9JCQKPioqRXEuIDIqKgoKJCRrID0gXGZyYWN7XGxhbWJkYSBcY2RvdCBGfXsxIC0gRn0kJAo+d2hlcmUgJFxsYW1iZGEkIGlzIHRoZSByYWRpb2FjdGl2ZSBkZWNheSBjb25zdGFudCAoMS84MjY3KS4KCkFzIHRoZSBkZWNvbXBvc2l0aW9uIHJhdGVzIHdpbGwgdmFyeSwgdGhlIGluaXRpYWwgXjE0XkMgY29udGVudCBjYW4gYmUgZGV0ZXJtaW5lZCBkeW5hbWljYWxseSB3aXRoIGVxdWF0aW9uIDEuCgpDYXJib24gc3RvY2tzIGFyZSBrbm93biwgd2hpbGUgaW5wdXRzIHdpbGwgYmUgZXN0aW1hdGVkIGFuZCBhcmUgcmVsYXRlZCB0byB0aGUgc3RlYWR5LXN0YXRlIGNvbmRpdGlvbnMgYnkgdGhlIGZvbGxvd2luZyBlcXVhdGlvbjogCj4qKkVxLiAzKioKCiQkSSA9IChrX3sxfSBcY2RvdCBDX3sxfSkgKyAoa197Mn0gXGNkb3QgQ197Mn0pJCQKPndoZXJlICpDfjF+KiBhbmQgKkN+Mn4qIGFyZSB0aGUgY2FyYm9uIHN0b2NrcyBvZiB0aGUgdHdvIG1vZGVsIHBvb2xzLgoKQm90aCBzdG9ja3MgYW5kIGlucHV0cyBjYW4gYmUgc2NhbGVkIHRvIHRoZSBrbm93biB2YWx1ZSBvZiB0aGUgdG90YWwgY2FyYm9uIHBvb2wgb25jZSB0aGUgc3RlYWR5LXN0YXRlIHBhcmFtZXRlcnMgKCprfjF+KiwgKmt+Mn4qLCBhbmQgJFxnYW1tYSQgb3IgJFxhbHBoYSQpIGhhdmUgYmVlbiBkZXRlcm1pbmVkLiBQb29sIHNpemVzIGFyZSBhIGZ1bmN0aW9uIG9mIHRoZSBpbnB1dHMgYW5kIGlucHV0IHBhcnRpdGlvbmluZyBjb2VmZmljaWVudCBhdCBzdGVhZHktc3RhdGUuCgpBIE1vbnRlLUNhcmxvIE1hcmtvdiBjaGFpbiBhcHByb2FjaCB3aWxsIGJlIHVzZWQgZm9yIHBhcmFtZXRlciBlc3RpbWF0aW9uIGluIGNvbWJpbmF0aW9uIHdpdGggYW4gaW5pdGlhbCBvcHRpbWl6YXRpb24gYWxnb3JpdGhtIHRvIGRldGVybWluZSB0aGUgYmVzdCBzZXQgb2YgaW5pdGlhbCBwYXJhbWV0ZXJzLgoKIyMgV29ya2Zsb3cKCkluaXRpYWwgbW9kZWwgZml0dGluZyB3YXMgcGVyZm9ybWVkIGZvciBib3RoIG1vZGVsIHN0cnVjdHVyZXMgdXNpbmcgZ2VuZXJvdXMgcGFyYW1ldGVyIHJhbmdlcyBbMCwgMV0gZm9yIGFsbCB0aHJlZSBwYXJhbWV0ZXJzICgqa34xfiosICprfjJ+KiwgJFxnYW1tYSQgb3IgJFxhbHBoYSQpLiBUaGUgaW5pdGlhbCBwYXJhbWV0ZXIgc2V0IHdhcyBmb3VuZCBieSBmaXR0aW5nIHRoZSBtb2RlbHMgYnkgZXllLCBmb2xsb3dlZCBieSBvcHRpbWl6YXRpb24gd2l0aCB0aGUgZnVuY3Rpb24gIm1vZEZpdCIgKFIgcGFja2FnZSBGTUUpLCB1c2luZyB0aGUgTmVsZGVyLU1lYWQgYWxnb3JpdGhtLiBUaGUgYmVzdCBzZXQgb2YgcGFyYW1ldGVycyBmb3VuZCBieSBtb2RGaXQgd2FzIHRoZW4gdXNlZCBhcyB0aGUgaW5wdXQgdG8gYSBNb250ZSBDYXJsbyBNYXJrb3YgQ2hhaW4gKE1DTUMpLCB1c2luZyB0aGUgZnVuY3Rpb24gIm1vZE1DTUMiIChSIHBhY2thZ2UgRk1FKS4gVGhlIG51bWJlciBvZiBpdGVyYXRpb25zIGZvciB0aGUgTUNNQyBvcHRpbWl6YXRpb24gd2FzIHNldCBhdCA1MDAwIGludGlhbGx5LCB3aXRoIGRlbGF5ZWQgcmVqZWN0aW9uIGVtcGxveWVkIHRvIGluY3JlYXNlIGVmZmljaWVuY3kuIAoKVGhlIHN1bSBvZiB0aGUgbWVhbiBzcXVhcmVkIGVycm9yIGZvciB0aGUgYmVzdCBwYXJhbWV0ZXIgc2V0IHdhcyBzbGlnaHRseSBsb3dlciBmb3IgdGhlIHBhcmFsbGVsIHN0cnVjdHVyZSB0aGFuIGZvciB0aGUgc2VyaWVzIHN0cnVjdHVyZS4gQWRkaXRpb25hbGx5LCB0aGUgb3ZlcmFsbCBtZWFuIGVycm9yIG9mIHRoZSByZXNpZHVhbHMgd2FzIGFsc28gbG93ZXIgZm9yIHRoZSBwYXJhbGxlbCBzdHJ1Y3R1cmUsIG1vZGVyYXRlbHkgc28gZm9yIHRoZSBidWxrIEMgb2JzZXJ2YXRpb25zIGJ1dCBzdWJzdGFudGlhbGx5IHNvIGZvciB0aGUgcmVzcGlyYXRpb24gb2JzZXJ2YXRpb25zIChpbiBhbmRlc2l0ZSBhbmQgZ3Jhbml0ZSBzb2lscyBpbiBwYXJ0aWN1bGFyKS4KCkhvd2V2ZXIsIHRoZXNlIGluaXRpYWwgZml0cyB5aWVsZGVkIHVucmVhbGlzdGljIHBhcmFtZXRlciBlc3RpbWF0ZXMgZm9yIG11bHRpcGxlIHNpdGVzLCBwYXJ0aWN1bGFybHkgYXQgdGhlIGxvd2VyIGRlcHRocy4gQWRkaXRpb25hbGx5LCB0aGUgbW9kRml0IG91dHB1dCBzaG93ZWQgdmVyeSBoaWdoIGNvcnJlbGF0aW9uIGJldHdlZW4gdGhlIHBhcmFtZXRlcnMgZm9yIGJvdGggbW9kZWwgc3RydWN0dXJlcyAoc2xpZ2h0bHkgaGlnaGVyIGZvciB0aGUgdHdvLXBvb2wgc2VyaWVzIG1vZGVsKS4gCgpgYGB7ciBtb2QtdXRpbHN9CiMgayBmcm9tIGZyYWN0aW9uIG1vZGVybgprIDwtIGZ1bmN0aW9uIChGbSkgewogIChGbSAqIGxhbWJkYSkvKDEgLSBGbSkKfQoKIyBkMTRDIGZyb20gZnJhY3Rpb24gbW9kZXJuIApmbV8xNGMgPC0gZnVuY3Rpb24gKGZtLCBkYXRlKSB7CiAgKGZtICogZXhwKGxhbWJkYSAqICgxOTUwIC0gZGF0ZSkpIC0gMSkgKiAxMDAwCn0KCiMgcHJlLWJvbWIgZnJhY3Rpb24gbW9kZXJuIGZyb20gayAoc3RlYWR5LXN0YXRlIGFzc3VtZWQpCmZtIDwtIGZ1bmN0aW9uIChrKXsKICBrLyhrICsgbGFtYmRhKQp9CmBgYAoKYGBge3IgbW9kLWNvbnN0cmFpbnRzLCBpbmNsdWRlID0gRkFMU0V9CiMjIFNPQyBzdG9ja3MKIyB1c2UgMjAxOSBTT0Mgc3RvY2tzIGZvciBzdGVhZHktc3RhdGUgZXN0aW1hdGVzCmNzb2MuMTkuMF8zMCA8LSBiaW5kX3Jvd3MoCiAgbGFwcGx5KHNyYS4yMDE5LnNwLmxzLCBmdW5jdGlvbihkZikgewogICAgZGYgPC0gc3VwcHJlc3NNZXNzYWdlcygKICAgICAgZGYgJT4lIAogICAgICAgIGZpbHRlcihseXJfYm90IDwgMzEgJiBseXJfYm90ID4gMCkgJT4lCiAgICAgICAgc2VsZWN0KFBNZWNvLCBseXJfdG9wLCBseXJfYm90LCBseXJfc29jKSAlPiUKICAgICAgICBncm91cF9ieShQTWVjbywgbHlyX3RvcCwgbHlyX2JvdCkgJT4lCiAgICAgICAgc3VtbWFyaXplKGx5cl9zb2MgPSBtZWFuKGx5cl9zb2MpKSkKICAgIHJldHVybihkYXRhLmZyYW1lKGRmKSkKICB9KQopCiMgY29udmVydCB0byAyNyBlbGVtZW50IGxpc3QKY3NvYy4xOS4wXzMwIDwtIHNwbGl0KGNzb2MuMTkuMF8zMCwgcGFzdGUwKGNzb2MuMTkuMF8zMCRQTWVjbywgIl8iLCBjc29jLjE5LjBfMzAkbHlyX3RvcCwgIi0iLCBjc29jLjE5LjBfMzAkbHlyX2JvdCkpCgojIyBJbnB1dHMKIyBJbnB1dHMgbWF5IHZhcnkgYW1vbmcgc2l0ZXMsIGFuZCBJIGNvdWxkIHVzZSByZXNwaXJhdGlvbiBkYXRhIGZyb20gaW5jdWJhdGlvbnMgYXMgYSBjb25zdHJhaW50CiMgSG93ZXZlciwgaW5pdGlhbCBpbnB1dHMgd2lsbCBiZSBzZXQgYXQgNCUgb2YgdGhlIGxheWVyIGNhcmJvbiBzdG9ja3MKaW4uaSA8LSBsYXBwbHkoY3NvYy4xOS4wXzMwLCBmdW5jdGlvbih4KSAuMDQgKiB4JGx5cl9zb2MpCiMgSW5wdXRzIHdpbGwgYmUgYWRqdXN0ZWQgYmFzZWQgb24gdGhlIGZpdHRlZCBwYXJhbWV0ZXJzIHRvIG1hdGNoIG1lYXN1cmVkIHN0b2NrcyBsYXRlcgoKIyMgMTRDIGNvbnN0cmFpbnRzCiMgYnVsawpvYnMuYnVsay4xNGMgPC0gdW5saXN0KAogIGxhcHBseShzZXFfYWxvbmcoc3JhLjE5LjAxLnJlcC5scyksIGZ1bmN0aW9uKGkpIHsKICAjIGluZGV4IGFsb25nIGRlcHRoIGludGVydmFscyAwLTEwLCAxMC0yMCwgMjAtMzAKICBkZXB0aC5scyA8LSBsYXBwbHkoc2VxX2Fsb25nKDE6MyksIGZ1bmN0aW9uKGopIHsKICAgIGModW5saXN0KGxhcHBseShzcmEuMTkuMDEucmVwLmxzW1tpXV0sICJbWyIsIGopKSwKICAgICAgc3BsaXQoc3BsaXQoc3JhLjE5LjAxLjA5LCBzcmEuMTkuMDEuMDkkUE1lY28pW1tpXV0sCiAgICAgICAgICAgIHNwbGl0KHNyYS4xOS4wMS4wOSwgc3JhLjE5LjAxLjA5JFBNZWNvKVtbaV1dWyJseXJfYm90Il0pW1tqXV1bICwgImZtIl1bMl0sCiAgICAgIHVubGlzdChzcGxpdChzcmEuMjAxOS5sc1tbaV1dLCBzcmEuMjAxOS5sc1tbaV1dWyJseXJfYm90Il0pW1tqXV1bImZtIl0pKQogIH0pCiAgcmVwczAxIDwtIGxlbmd0aChzcmEuMTkuMDEucmVwLmxzW1tpXV0pCiAgZGVwdGguZGZzIDwtIGxhcHBseShkZXB0aC5scywgZnVuY3Rpb24oZm0pIHsKICAgIGRhdGEuZnJhbWUodGltZSA9IGMocmVwKDIwMDEuNSwgcmVwczAxKSwgMjAwOS41LCByZXAoMjAxOS41LCAzKSksCiAgICAgICAgICAgICAgIGJ1bGtDID0gRGVsdGExNENfZnJvbV9BYnNvbHV0ZUZyYWN0aW9uTW9kZXJuKGZtKSkKICB9KQogIHJldHVybihkZXB0aC5kZnMpCn0pLCByZWN1cnNpdmUgPSBGQUxTRSkKbmFtZXMob2JzLmJ1bGsuMTRjKSA8LSBwYXN0ZTAocmVwKGMoIkFOIiwgIkJTIiwgIkdSIiksIGVhY2ggPSA5KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwKGMoInBwIiwgInJmIiwgIndmIiksIGVhY2ggPSAzLCB0aW1lcyA9IDMpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXAoYygiXzAtMTAiLCAiXzEwLTIwIiwgIl8yMC0zMCIpLCB0aW1lcyA9IDkpKQoKIyByZXNwaXJhdGlvbgpvYnMucmVzcC4xNGMgPC0gc3BsaXQoc3JhLjIwMTkuaW5jLmRmXzEsIGdzdWIoImNvbXBfIiwgIiIsIHNyYS4yMDE5LmluYy5kZl8xJGx5cl9uYW1lKSkKb2JzLnJlc3AuMTRjIDwtIGxhcHBseShvYnMucmVzcC4xNGMsIGZ1bmN0aW9uKGRmKSB7CiAgZGYkcmVzcCA8LSBkZiRkMTRjCiAgZGYkdGltZSA8LSBkZiRZZWFyICsgLjUKICByZXR1cm4oZGZbICwgYygidGltZSIsICJyZXNwIildKQp9KQpgYGAKCmBgYHtyIG1vZC1mdW5zLWdlbn0KIyBpbmRleCBvZiB5ZWFycyBmb3Igd2hpY2ggYnVsay9yZXNwIDE0QyBhcmUga25vd24KeWVhci5peCA8LSBjKHdoaWNoKERhdG0kRGF0ZSA9PSAyMDAxLjUpLAogICAgICAgICAgICAgd2hpY2goRGF0bSREYXRlID09IDIwMDkuNSksCiAgICAgICAgICAgICB3aGljaChEYXRtJERhdGUgPT0gMjAxOS41KSkKCiMgZnVuY3Rpb24gZm9yIHNhdmluZyBjb25zdHJhaW50IGRhdGEgaW4gYSBkYXRhZnJhbWUgZm9yIHBsb3R0aW5nIGluIGdncGxvdCcKIyBOQiBzaG91bGQgY2hhbmdlIHRoaXMgdG8gcmVmZXJlbmNlIG9icy5idWxrLjE0YyBhbmQgb2JzLnJlc3AuMTRjIGRmcwojIGNvbi5kZi5meCA8LSBmdW5jdGlvbihQTWVjbywgZGVwdGgpIHsKIyAgIGJ1bGsuZGYgPC0gb2JzLmJ1bGsuMTRbW3Bhc3RlMChQTWVjbywgIl8iLCBkZXB0aCldXQojICAgcmVzcC5kZiA8LSBjYmluZChzcmEuMjAxOS5pbmMuZGZfMVtzcmEuMjAxOS5pbmMuZGZfMSRQTWVjbyA9PSBQTWVjbyAmCiMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JhLjIwMTkuaW5jLmRmXzEkbHlyX2JvdCA9PSBseXJfYm90LCBjKCJZZWFyIiwgImQxNGMiKV0sIGQxNGNfc2QgPSBOQSkKIyAgIGNvbi5kZiA8LSBjYmluZChwb29sID0gYyhyZXAoImJ1bGsgQyIsIG5yb3coYnVsay5kZikpLCByZXAoInJlc3BpcmF0aW9uIiwgbnJvdyhyZXNwLmRmKSkpLCByYmluZChidWxrLmRmLCByZXNwLmRmKSkKIyAgIGNvbi5kZiRkMTRjX2wgPC0gY29uLmRmJGQxNGMgLSBjb24uZGYkZDE0Y19zZAojICAgY29uLmRmJGQxNGNfdSA8LSBjb24uZGYkZDE0YyArIGNvbi5kZiRkMTRjX3NkCiMgICBjb24uZGYkWWVhciA8LSBhcy5udW1lcmljKGFzLmNoYXJhY3Rlcihjb24uZGYkWWVhcikpCiMgICByZXR1cm4oY29uLmRmKQojIH0KY29uLmRmLmZ4IDwtIGZ1bmN0aW9uKFBNZWNvLCBseXJfYm90KSB7CiAgYnVsay5kZiA8LSBzcmEuMTkuMDEuMDlbc3JhLjE5LjAxLjA5JFBNZWNvID09IFBNZWNvICYKICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JhLjE5LjAxLjA5JGx5cl9ib3QgPT0gbHlyX2JvdCwgYygiWWVhciIsICJkMTRjIiwgImQxNGNfc2QiKV0KICByZXNwLmRmIDwtIGNiaW5kKHNyYS4yMDE5LmluYy5kZl8xW3NyYS4yMDE5LmluYy5kZl8xJFBNZWNvID09IFBNZWNvICYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JhLjIwMTkuaW5jLmRmXzEkbHlyX2JvdCA9PSBseXJfYm90LCBjKCJZZWFyIiwgImQxNGMiKV0sIGQxNGNfc2QgPSBOQSkKICBjb24uZGYgPC0gY2JpbmQocG9vbCA9IGMocmVwKCJidWxrIEMiLCBucm93KGJ1bGsuZGYpKSwgcmVwKCJyZXNwaXJhdGlvbiIsIG5yb3cocmVzcC5kZikpKSwgcmJpbmQoYnVsay5kZiwgcmVzcC5kZikpCiAgY29uLmRmJGQxNGNfbCA8LSBjb24uZGYkZDE0YyAtIGNvbi5kZiRkMTRjX3NkCiAgY29uLmRmJGQxNGNfdSA8LSBjb24uZGYkZDE0YyArIGNvbi5kZiRkMTRjX3NkCiAgY29uLmRmJFllYXIgPC0gYXMubnVtZXJpYyhhcy5jaGFyYWN0ZXIoY29uLmRmJFllYXIpKQogIHJldHVybihjb24uZGYpCn0KCiMgcGxvdCBmdW5jdGlvbgpDMTQuMnAucGxvdC5meCA8LSBmdW5jdGlvbihwbG90LmRmLCBjb24uZGYsIG1vZCkgewogIHBsb3QuZGYgJT4lCiAgZmlsdGVyKHBvb2wgPT0gImJ1bGsgQyIgfCBwb29sID09ICJyZXNwaXJhdGlvbiIgfCBwb29sID09ICJhdG0iKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKHllYXJzLCBkMTRDLCBjb2xvciA9IHBvb2wpKSArCiAgZ2VvbV9wYXRoKCkgKwogIGdlb21fcG9pbnQoZGF0YSA9IGNvbi5kZiwgYWVzKFllYXIsIGQxNGMsIGNvbG9yID0gcG9vbCksIHNpemUgPSAzKSArCiAgZ2VvbV9lcnJvcmJhcihkYXRhID0gY29uLmRmLAogICAgYWVzKHggPSBZZWFyLAogICAgICAgIHltaW4gPSBkMTRjX2wsIAogICAgICAgIHltYXggPSBkMTRjX3UsIAogICAgICAgIGNvbG9yID0gcG9vbCksIAogICAgd2lkdGggPSAuMSwKICAgIGluaGVyaXQuYWVzID0gRkFMU0UpICsKICBzY2FsZV9jb2xvcl9tYW51YWwoCiAgICBuYW1lID0gIk1vZGVsIHBvb2wiLAogICAgdmFsdWVzID0gYygiYXRtIiA9IDgsCiAgICAgICAgICAgICAgICJidWxrIEMiID0gImJsYWNrIiwKICAgICAgICAgICAgICAgImZhc3QiID0gIiNEODFCNjAiLAogICAgICAgICAgICAgICAic2xvdyIgPSAiIzFFODhFNSIsCiAgICAgICAgICAgICAgICJyZXNwaXJhdGlvbiIgPSAiI0ZGQzEwNyIpKSArCiAgc2NhbGVfeF9jb250aW51b3VzKGxpbWl0cyA9IGMoMTk1MCwgMjAyMikpICsKICBnZ3RpdGxlKHBhc3RlMChQTWVjbywgIl8iLCBseXJfdG9wLCAiLSIsIGx5cl9ib3QsICIgIiwgbW9kKSkgKwogIHhsYWIoIlllYXIiKSArCiAgeWxhYihleHByZXNzaW9uKCcnKkRlbHRhKicnXjE0KidDICjigLApJykpICsKICB0aGVtZV9idygpICsKICB0aGVtZShwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpKQp9CgojIHNldCB1cCBtb2RlbCBmdW5jdGlvbiBmb3Igb3B0aW1pemF0aW9uCm1vZEZ1bl8ycCA8LSBmdW5jdGlvbihwYXJzLCBJbiwgbGFnID0gNSwgcGFzcyA9IFRSVUUsIG91dCA9ICJtb2RGaXQiLCBtb2QpIHsKIAogICMgaW50aWFsIDE0QwogIEYwX0RlbHRhMTRDIDwtIHVubGlzdChsYXBwbHkocGFyc1sxOjJdLCBmdW5jdGlvbih4KSBEZWx0YTE0Q19mcm9tX0Fic29sdXRlRnJhY3Rpb25Nb2Rlcm4oZm0oeCkpKSkKICAKICAjIG1vZGVsIG1hdHJpeAogIEEgPC0gLTEgKiBkaWFnKHBhcnNbMToyXSkKICBpZiAobW9kID09ICIycHMiKSB7CiAgICBBWzIsIDFdIDwtIHBhcnNbM10KICB9CiAgICAKICAjIHN0ZWFkeS1zdGF0ZSBDIHN0b2NrcwogIHNzLmNzdG9jayA8LSAoLTEgKiBzb2x2ZShBKSAlKiUgYyhJbiAqIHBhcnNbM10sIEluICogKDEgLSBwYXJzWzNdKSkpCiAgCiAgIyB0aW1lIGluZGV4CiAgaXgudCA8LSBjKChsYWcgKyAxKTpucm93KERhdG0pKQogIAogICMgbW9kZWwKICBpZiAobW9kID09ICIycHAiKSB7CiAgICBtb2QgPC0gVHdvcFBhcmFsbGVsTW9kZWwxNCh0ID0gRGF0bSREYXRlW2l4LnRdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga3MgPSBwYXJzWzE6Ml0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDMCA9IGMoc3MuY3N0b2NrWzFdLCBzcy5jc3RvY2tbMl0pLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRjBfRGVsdGExNEMgPSBGMF9EZWx0YTE0QywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluID0gSW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnYW0gPSBwYXJzWzNdLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXRGYyA9IERhdG0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWcgPSBsYWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXNzID0gcGFzcykKICB9IGVsc2UgewogICAgbW9kIDwtIFR3b3BTZXJpZXNNb2RlbDE0KHQgPSBEYXRtJERhdGVbaXgudF0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAga3MgPSBwYXJzWzE6Ml0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQzAgPSBjKHNzLmNzdG9ja1sxXSwgc3MuY3N0b2NrWzJdKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGMF9EZWx0YTE0QyA9IEYwX0RlbHRhMTRDLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEluID0gSW4sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYTIxID0gcGFyc1szXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dEZjID0gRGF0bSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWcgPSBsYWcsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFzcyA9IHBhc3MpCiAgfQogIAogICMgZ2V0IG1vZCB2YWx1ZXMKICBDMTRtIDwtIGdldEYxNEMobW9kKQogIEMxNHAgPC0gZ2V0RjE0KG1vZCkKICBDMTRyIDwtIGdldEYxNFIobW9kKQogIEN0b3QgPC0gZ2V0Qyhtb2QpCiAgCiAgaWYob3V0ID09ICJtb2RGaXQiKSB7CiAgICAjIGRhdGFmcmFtZSBmb3IgbW9kRml0IGZ4CiAgICByZXR1cm4oZGF0YS5mcmFtZSgKICAgICAgdGltZSA9IERhdG0kRGF0ZVtpeC50XSwKICAgICAgYnVsa0MgPSBDMTRtLCAKICAgICAgcmVzcCA9IEMxNHIpKQogIH0gZWxzZSB7CiAgICAjIGRhdGEgZnJhbWUgZm9yIHBsb3R0aW5nCiAgICByZXR1cm4oZGF0YS5mcmFtZSgKICAgICAgeWVhcnMgPSByZXAoRGF0bSREYXRlW2l4LnRdLCA1KSwKICAgICAgZDE0QyA9IGMoQzE0cFssMV0sIAogICAgICAgICAgICAgICBDMTRwWywyXSwgCiAgICAgICAgICAgICAgIEMxNG0sCiAgICAgICAgICAgICAgIEMxNHIsCiAgICAgICAgICAgICAgIERhdG0kTkhjMTRbaXgudF0pLAogICAgICBwb29sID0gcmVwKGMoImZhc3QiLCAic2xvdyIsICJidWxrIEMiLCAicmVzcGlyYXRpb24iLCAiYXRtIiksIGVhY2ggPSBucm93KEMxNHApKSkpCiAgfQp9CgojIGZ1bmN0aW9uIGZvciB0cmlhbCBhbmQgZXJyb3IgYXBwcm9hY2ggdG8gZmluZGluZyBpbml0aWFsIHBhcmFtZXRlciBzZXQKcGFyLmZ4IDwtIGZ1bmN0aW9uKHBhcnMsIEluLCBsYWcgPSA1LCBvdXQgPSAicGxvdC5kZiIsIHZlcmJvc2UgPSBUUlVFLCBtb2QpIHsKICAKICAjIG1vZGVsIG1hdHJpeAogIEEgPC0gLTEgKiBkaWFnKHBhcnNbMToyXSkKICBpZiAobW9kID09ICIycHMiKSB7CiAgICBBWzIsIDFdIDwtIHBhcnNbM10KICB9CiAgCiAgIyBzdGVhZHktc3RhdGUgc3RvY2tzCiAgc3MuY3N0b2NrIDwtICgtMSAqIHNvbHZlKEEpICUqJSBjKEluICogcGFyc1szXSwgSW4gKiAoMSAtIHBhcnNbM10pKSkKICAKICAjIHByaW50IHNpdGUgYW5kIHN0ZWFkeS1zdGF0ZSBzdG9ja3MKICBpZih2ZXJib3NlKSB7CiAgICBjYXQocGFzdGUwKFBNZWNvLCAiXyIsIGx5cl90b3AsICItIiwgbHlyX2JvdCksICJcbiIpCiAgICBjYXQocm91bmQoY29sU3Vtcyhzcy5jc3RvY2spLCAxKSwgIiAobW9kZWxlZCBzdG9ja3MpXG4iKQogICAgY2F0KGNzb2MuMTkuMF8zMFtbcGFzdGUwKFBNZWNvLCAiXyIsIGx5cl90b3AsICItIiwgbHlyX2JvdCldXVsgLCAibHlyX3NvYyJdLCAiIChtZWFzdXJlZCBzdG9ja3MpXG4iKSAKICB9CiAgCiAgaWYgKG1vZCA9PSAiMnBwIikgewogICByZXR1cm4obW9kRnVuXzJwKHBhcnMgPSBwYXJzLCBJbiA9IEluLCBsYWcgPSBsYWcsIG91dCA9IG91dCwgbW9kID0gIjJwcCIpKSAKICB9IGVsc2UgewogICAgcmV0dXJuKG1vZEZ1bl8ycChwYXJzID0gcGFycywgSW4gPSBJbiwgbGFnID0gbGFnLCBvdXQgPSBvdXQsIG1vZCA9ICIycHMiKSkgCiAgfQp9CmBgYAoKYGBge3Igb3B0LW1vZCwgZXZhbCA9IEZBTFNFfQojIE5vdGU6IHRoaXMgb25seSBydW5zIGlmIGV2YWwgZmxhZyBzd2l0Y2hlZCB0byBUUlVFCiMjIE9wdGltaXplIG1vZGVsIHBhcnMKIyBDb3N0IGZ1bmN0aW9uIChldmFsdWF0ZXMgZXJyb3IgYXMgbW9kZWwgdnMuIG9ic3YsIHBlciBGTUUgcmVxKQojIG5vdGUgdGhhdCB3ZSBoYXZlIHRvIHNldCAicGFzcyIgdG8gVFJVRSBzbyBTb2lsUiBtb2RlbCBkb2Vzbid0IGZhaWwgKG5lZy4gcmVzcCkKbW9kLmZpdHMuZnggPC0gZnVuY3Rpb24obW9kLCBwYXJzLCBzdWIsIHVwcGVyLCBsb3dlcikgewogICMgc3RhcnQgbG9vcAogIGxhcHBseShzZXFfYWxvbmcocGFyc1tzdWJdKSwgZnVuY3Rpb24oaSkgewogICAgIyBzdGFydCB0aW1lciBhbmQgcHJpbnQgUE1lY29fZGVwdGgKICAgIHN0YXJ0IDwtIFN5cy50aW1lKCkKICAgIGNhdChwYXN0ZTAobmFtZXMocGFycylbc3ViXVtpXSwgIiBwYXJhbWV0ZXIgZml0dGluZ1xuIikpCiAgCiAgIyBkZWZpbmUgY29zdCBmdW5jdGlvbiBmb3IgY3VycmVudCBpdGVyYXRpb24KICAgIGlmIChtb2QgPT0gIjJwcCIpIHsKICAgICAgbW9kLkNvc3QgPC0gZnVuY3Rpb24ocGFycykgewogICAgICAgIG1vZGVsT3V0cHV0IDwtIG1vZEZ1bl8ycChwYXJzLCBpbi5pW3N1Yl1bW2ldXSwgbW9kID0gIjJwcCIpCiAgICAgICAgY29zdDEgPC0gbW9kQ29zdChtb2RlbCA9IG1vZGVsT3V0cHV0LCBvYnMgPSBvYnMuYnVsay4xNGNbc3ViXVtbaV1dLCBzY2FsZVZhciA9IFRSVUUpCiAgICAgICAgcmV0dXJuKG1vZENvc3QobW9kZWwgPSBtb2RlbE91dHB1dCwgb2JzID0gb2JzLnJlc3AuMTRjW3N1Yl1bW2ldXSwgY29zdCA9IGNvc3QxKSkKICAgICAgfQogICAgfSBlbHNlIHsKICAgICAgbW9kLkNvc3QgPC0gZnVuY3Rpb24ocGFycykgewogICAgICAgIG1vZGVsT3V0cHV0IDwtIG1vZEZ1bl8ycChwYXJzLCBpbi5pW3N1Yl1bW2ldXSwgbW9kID0gIjJwcyIpCiAgICAgICAgY29zdDEgPC0gbW9kQ29zdChtb2RlbCA9IG1vZGVsT3V0cHV0LCBvYnMgPSBvYnMuYnVsay4xNGNbc3ViXVtbaV1dLCBzY2FsZVZhciA9IFRSVUUpCiAgICAgICAgcmV0dXJuKG1vZENvc3QobW9kZWwgPSBtb2RlbE91dHB1dCwgb2JzID0gb2JzLnJlc3AuMTRjW3N1Yl1bW2ldXSwgY29zdCA9IGNvc3QxKSkKICAgICAgfQogICAgfQogICAgCiAgICAjIGZpdCBwYXJzCiAgICBmaXQgPC0gdHJ5Q2F0Y2goCiAgICAgIG1vZEZpdChmID0gbW9kLkNvc3QsCiAgICAgICAgICAgICBwID0gcGFyc1tzdWJdW1tpXV0sCiAgICAgICAgICAgICBtZXRob2QgPSAnTmVsZGVyLU1lYWQnLAogICAgICAgICAgICAgdXBwZXIgPSB1cHBlciwgCiAgICAgICAgICAgICBsb3dlciA9IGxvd2VyKSwKICAgICAgZXJyb3IgPSBmdW5jdGlvbiAoZSkge2NhdCgiRVJST1IgOiIsIGNvbmRpdGlvbk1lc3NhZ2UoZSksICJcbiIpfSkKICAgIAogICAgIyBFbmQgdGltZXIgYW5kIHByaW50IGVsYXBzZWQgdGltZQogICAgZW5kIDwtIFN5cy50aW1lKCkKICAgIGNhdChwYXN0ZTAoInRpbWU6ICIsIGVuZCAtIHN0YXJ0LCAiXG4iKSkKICAgIAogICAgIyBSZXR1cm4gZml0dGVkIHBhcmFtZXRlcnMKICAgIHJldHVybihmaXQpCn0pIAp9CgojIGxvYWQgaW5pdGlhbCBwYXJhbWV0ZXIgc2V0CmxvYWQoIi4uL2RhdGEvZGVyaXZlZC9tb2RGaXRfcGFycy9wYXJzLmkuMnBwXzIwMjAtMTEtMTYuUmRhdGEiKQpsb2FkKCIuLi9kYXRhL2Rlcml2ZWQvbW9kRml0X3BhcnMvcGFycy5pLjJwc18yMDIwLTExLTE2LlJkYXRhIikKCiMgU3RhcnQgd2l0aCBqdXN0IDAtMTAgY20gZGVwdGggaW5jcmVtZW50Cml4LjEwIDwtIHNlcSgxLCAyNywgMykKCiMjIDJwcAojIHBhciByYW5nZSBbMCwgMV0gZm9yIGFsbCBwYXJzCm1vZC5maXRzLjJwcCA8LSBtb2QuZml0cy5meChtb2QgPSAiMnBwIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnMgPSBwYXJzLmkuMnBwLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YiA9IGl4LjEwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBwZXIgPSBjKDEsIDEsIDEpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbG93ZXIgPSBjKDAsIDAsIDApKQpuYW1lcyhtb2QuZml0cy4ycHApIDwtIG5hbWVzKHBhcnMuaS4ycHApW2l4LjEwXQpzYXZlKG1vZC5maXRzLjJwcCwgZmlsZSA9IHBhc3RlMCgiLi4vZGF0YS9kZXJpdmVkL21vZEZpdF9wYXJzLyIsICJtb2QuZml0cy4ycHAiLCAiXyIsIFN5cy5EYXRlKCksICIuUmRhdGEiKSkKIyBjb25zdHJhaW4gZ2FtbWEgdG8gWzAuNSwgMC45NV0KbW9kLmZpdHMuMnBwLnAzLjUuOTUgPC0gbW9kLmZpdHMuZngobW9kID0gIjJwcCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnMgPSBwYXJzLmkuMnBwLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdWIgPSBpeC4xMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBwZXIgPSBjKDEsIDEsIDAuOTUxKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG93ZXIgPSBjKDAsIDAsIDAuNSkpCm5hbWVzKG1vZC5maXRzLjJwcC5wMy41Ljk1KSA8LSBuYW1lcyhwYXJzLmkuMnBwKVtpeC4xMF0Kc2F2ZShtb2QuZml0cy4ycHAucDMuNS45NSwgZmlsZSA9IHBhc3RlMCgiLi4vZGF0YS9kZXJpdmVkL21vZEZpdF9wYXJzLyIsICJtb2QuZml0cy4ycHAucDMuNS45NSIsICJfIiwgU3lzLkRhdGUoKSwgIi5SZGF0YSIpKQoKIyMgMnBzCiMgcGFyIHJhbmdlIFswLCAxXSBmb3IgYWxsIHBhcnMKbW9kLmZpdHMuMnBzIDwtIG1vZC5maXRzLmZ4KG1vZCA9ICIycHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFycyA9IHBhcnMuaS4ycHMsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViID0gaXguMTAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cHBlciA9IGMoMSwgMSwgMSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb3dlciA9IGMoMCwgMCwgMCkpCm5hbWVzKG1vZC5maXRzLjJwcykgPC0gbmFtZXMocGFycy5pLjJwcylbaXguMTBdCnNhdmUobW9kLmZpdHMuMnBzLCBmaWxlID0gcGFzdGUwKCIuLi9kYXRhL2Rlcml2ZWQvbW9kRml0X3BhcnMvIiwgIm1vZC5maXRzLjJwcyIsICJfIiwgU3lzLkRhdGUoKSwgIi5SZGF0YSIpKQpgYGAKCmBgYHtyIHJlcG9ydC1wYXItZml0fQojIGluZGV4IGZvciAwLTEwIGNtIGRlcHRoIGluY3JlbWVudHMKaXguMTAgPC0gc2VxKDEsIDI3LCAzKQoKIyBsb2FkIGluaXRpYWwgcGFyYW1ldGVycyBhcyBuZWVkZWQKaWYgKCFleGlzdHMoInBhcnMuaS4ycHAiKSkgewogbG9hZCgiLi4vZGF0YS9kZXJpdmVkL21vZEZpdF9wYXJzL3BhcnMuaS4ycHBfMjAyMC0xMS0xNi5SZGF0YSIpIAp9CmlmICghZXhpc3RzKCJwYXJzLmkuMnBzIikpIHsKICBsb2FkKCIuLi9kYXRhL2Rlcml2ZWQvbW9kRml0X3BhcnMvcGFycy5pLjJwc18yMDIwLTExLTE2LlJkYXRhIikgIAp9CgojIGxvYWQgZml0cyBhcyBuZWVkZWQKaWYgKCFleGlzdHMoIm1vZC5maXRzLjJwcCIpKSB7CiBsb2FkKGZpbGUgPSAiLi4vZGF0YS9kZXJpdmVkL21vZEZpdF9wYXJzL21vZC5maXRzLjJwcF8yMDIwLTExLTE2LlJEYXRhIikKfQppZiAoIWV4aXN0cygibW9kLmZpdHMuMnBwLnAzLjUuOTUiKSkgewogIGxvYWQoIi4uL2RhdGEvZGVyaXZlZC9tb2RGaXRfcGFycy9wYXJzLmkuMnBzXzIwMjAtMTEtMTYuUmRhdGEiKSAgCn0KaWYgKCFleGlzdHMoIm1vZC5maXRzLjJwcyIpKSB7CiBsb2FkKGZpbGUgPSAiLi4vZGF0YS9kZXJpdmVkL21vZEZpdF9wYXJzL21vZC5maXRzLjJwcF8yMDIwLTExLTE2LlJEYXRhIikKfQoKIyMgUGFyIGVzdGltYXRlcwojIDJwcApwYXJzLmZpdC4ycHAgPC0gbGFwcGx5KG1vZC5maXRzLjJwcCwgIltbIiwgMSkKbmFtZXMocGFycy5maXQuMnBwKSA8LSBuYW1lcyhwYXJzLmkuMnBwKVtpeC4xMF0KIyAycHAgZ2FtID0gWy41LCAuOTVdCnBhcnMuZml0LjJwcC5wMy41Ljk1IDwtIGxhcHBseShtb2QuZml0cy4ycHAucDMuNS45NSwgIltbIiwgMSkKbmFtZXMocGFycy5maXQuMnBwLnAzLjUuOTUpIDwtIG5hbWVzKHBhcnMuaS4ycHApW2l4LjEwXQojIDJwcwpwYXJzLmZpdC4ycHMgPC0gbGFwcGx5KG1vZC5maXRzLjJwcywgIltbIiwgMSkKbmFtZXMocGFycy5maXQuMnBzKSA8LSBuYW1lcyhwYXJzLmkuMnBzKVtpeC4xMF0KCiMjIFN1bW1hcnkgb2YgZml0cwojIDJwcApwYXJzLmZpdC4ycHAuc3VtIDwtIGxhcHBseShtb2QuZml0cy4ycHAsIGZ1bmN0aW9uKHgpIHsKICB0cnlDYXRjaChzdW1tYXJ5KHgpLCAKICAgICAgICAgICBlcnJvciA9IGZ1bmN0aW9uIChlKSB7Y2F0KCJFUlJPUiA6IiwgY29uZGl0aW9uTWVzc2FnZShlKSwgIlxuIil9KQp9KQpuYW1lcyhwYXJzLmZpdC4ycHAuc3VtKSA8LSBuYW1lcyhwYXJzLmZpdC4ycHApCiMgMnBzCnBhcnMuZml0LjJwcy5zdW0gPC0gbGFwcGx5KG1vZC5maXRzLjJwcywgZnVuY3Rpb24oeCkgewogIHRyeUNhdGNoKHN1bW1hcnkoeCksIAogICAgICAgICAgIGVycm9yID0gZnVuY3Rpb24gKGUpIHtjYXQoIkVSUk9SIDoiLCBjb25kaXRpb25NZXNzYWdlKGUpLCAiXG4iKX0pCn0pCm5hbWVzKHBhcnMuZml0LjJwcy5zdW0pIDwtIG5hbWVzKHBhcnMuZml0LjJwcykKCiMjIFN1bW1hcnkgb2YgZXJyb3JzCiMgYmVzdCBwYXIgc2V0IChzc3IpCnNzci4ycHAuZGYgPC0gZGF0YS5mcmFtZShiaW5kX3Jvd3MobGFwcGx5KG1vZC5maXRzLjJwcCwgIlsiLCAic3NyIiksIC5pZCA9ICJQTWVjb19kZXB0aCIpKQpzc3IuMnBzLmRmIDwtIGRhdGEuZnJhbWUoYmluZF9yb3dzKGxhcHBseShtb2QuZml0cy4ycHMsICJbIiwgInNzciIpLCAuaWQgPSAiUE1lY29fZGVwdGgiKSkKIyBtZWFuIHJlc2lkdWFscywgYnkgdmFyICh2YXJfbXMpCnZhcl9tcy5kZi5meCA8LSBmdW5jdGlvbihtb2QuZml0cy5scykgewogIGRmIDwtIGRhdGEuZnJhbWUoYmluZF9yb3dzKGxhcHBseShtb2QuZml0cy5scywgIlsiLCAidmFyX21zIiksIC5pZCA9ICJQTWVjb19kZXB0aCIpKQogIGRmJHZhciA8LSByZXAoYygicmVzcCIsICJidWxrQyIpLCBucm93KGRmKS8yKQogIGRmJHZhcl9tcyA8LSByb3VuZChkZiR2YXJfbXMsIDUpCiAgcmV0dXJuKGRmKQp9CnZhcl9tcy4ycHAuZGYgPC0gdmFyX21zLmRmLmZ4KG1vZC5maXRzLjJwcCkKdmFyX21zLjJwcy5kZiA8LSB2YXJfbXMuZGYuZngobW9kLmZpdHMuMnBzKQoKIyBiaW5kIGZpdHRlZCBwYXJzIHdpdGggaW5pdGlhbCBwYXJzIGludG8gZGF0YSBmcmFtZSBmb3IgcGxvdHRpbmcvc3VtbWFyaXppbmcKcGFyLmZpdC5kZi5meCA8LSBmdW5jdGlvbihtb2QsIHBhcnMuZml0LCBwYXJzLmkpIHsKICBkZiA8LSBiaW5kX3Jvd3MoCiAgICBsYXBwbHkoCiAgICAgIG1hcHBseShyYmluZCwgCiAgICAgICAgICAgICBwYXJzLmZpdCwKICAgICAgICAgICAgIHBhcnMuaSwKICAgICAgICAgICAgIFNJTVBMSUZZID0gRkFMU0UpLCAKICAgICAgZnVuY3Rpb24oZGYpIHsKICAgICAgICBkZiA8LSBkYXRhLmZyYW1lKGRmKQogICAgICAgIGlmIChtb2QgPT0gIjJwcCIpIHsKICAgICAgICAgIGNvbG5hbWVzKGRmKSA8LSBjKCJrZmFzdCIsICJrc2xvdyIsICJnYW0iKQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICBjb2xuYW1lcyhkZikgPC0gYygia2Zhc3QiLCAia3Nsb3ciLCAiYTIxIikKICAgICAgICB9CiAgICAgICAgZGYkZXN0IDwtIGMoImZpdCIsICJpbml0IikKICAgICAgICByZXR1cm4oZGYpCiAgICAgIH0pCiAgKQogIGRmJFBNZWNvX2RlcHRoIDwtIHJlcChuYW1lcyhwYXJzLmkpLCBlYWNoID0gMikKICBkZiRQTSA8LSBzdWJzdHIoZGYkUE1lY29fZGVwdGgsIHN0YXJ0ID0gMSwgc3RvcCA9IDIpCiAgZGYkZWNvIDwtIHN1YnN0cihkZiRQTWVjb19kZXB0aCwgc3RhcnQgPSAzLCBzdG9wID0gNCkKICBkZiRkZXB0aCA8LSBzdWJzdHIoZGYkUE1lY29fZGVwdGgsIHN0YXJ0ID0gNiwgc3RvcCA9IGxlbmd0aChkZiRQTWVjb19kZXB0aCkpCiAgcmV0dXJuKGRmKQp9CgoKIyMgMnBwCiMgZ2FtIHJhbmdlID0gWzAsIDFdCnBhcnMuZml0LjJwcC5kZiA8LSBwYXIuZml0LmRmLmZ4KG1vZCA9ICIycHAiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzLmZpdCA9IHBhcnMuZml0LjJwcCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFycy5pID0gcGFycy5pLjJwcFtpeC4xMF0pCiMgZ2FtIHJhbmdlID0gWy41LCAuOTVdCnBhcnMuZml0LjJwcC5wMy41Ljk1LmRmIDwtIHBhci5maXQuZGYuZngobW9kID0gIjJwcCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFycy5maXQgPSBwYXJzLmZpdC4ycHAucDMuNS45NSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzLmkgPSBwYXJzLmkuMnBwW2l4LjEwXSkKIyMgMnBzCiMgYTIxIHJhbmdlID0gWzAsIDFdCnBhcnMuZml0LjJwcy5kZiA8LSBwYXIuZml0LmRmLmZ4KG1vZCA9ICIycHMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzLmZpdCA9IHBhcnMuZml0LjJwcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFycy5pID0gcGFycy5pLjJwc1tpeC4xMF0pCgojIyBTdW1tYXJpemUgYnkgUE0sIGRlcHRoCiMgMnBwCiMgUE0vZGVwdGgKcGFycy5maXQuMnBwLmRmLlBNIDwtIHN1cHByZXNzTWVzc2FnZXMoCiAgcGFycy5maXQuMnBwLmRmICU+JQogICAgZmlsdGVyKGVzdCA9PSAiZml0IikgJT4lCiAgICBzZWxlY3QoIWMoZXN0LCBQTWVjb19kZXB0aCwgZWNvKSkgJT4lCiAgICBncm91cF9ieShQTSwgZGVwdGgpICU+JQogICAgc3VtbWFyaXplX2FsbChsaXN0KG1lYW4gPSBtZWFuLCBzZCA9IHNkKSkgJT4lCiAgICBtdXRhdGVfaWYoaXMubnVtZXJpYywgZm9ybWF0LCBkaWdpdHMgPSAyKQopCiMgIyBwcmludCB0YWJsZQojIGtuaXRyOjprYWJsZShwYXJzLmZpdC4ycHAuZGYuUE0sCiMgICAgICAgICAgICAgIGNhcHRpb24gPSAiTWVhbiBwYXJhbWV0ZXIgZXN0aW1hdGVzIGJ5IHBhcmVudCBtYXRlcmlhbCAoUE0pIiwKIyAgICAgICAgICAgICAgYWxpZ24gPSAiYyIpCiMgZWNvL2RlcHRoCnBhcnMuZml0LjJwcC5kZi5lY28gPC0gc3VwcHJlc3NNZXNzYWdlcygKICBwYXJzLmZpdC4ycHAuZGYgJT4lCiAgICBmaWx0ZXIoZXN0ID09ICJmaXQiKSAlPiUKICAgIHNlbGVjdCghYyhlc3QsIFBNZWNvX2RlcHRoLCBQTSkpICU+JQogICAgZ3JvdXBfYnkoZWNvLCBkZXB0aCkgJT4lCiAgICBzdW1tYXJpemVfYWxsKGxpc3QobWVhbiA9IG1lYW4sIHNkID0gc2QpKSAlPiUKICAgIG11dGF0ZV9pZihpcy5udW1lcmljLCBmb3JtYXQsIGRpZ2l0cyA9IDIpCikKIyAjIHByaW50IHRhYmxlCiMga25pdHI6OmthYmxlKHBhcnMuZml0LjJwcC5kZi5lY28sCiMgICAgICAgICAgICAgIGNhcHRpb24gPSAiTWVhbiBwYXJhbWV0ZXIgZXN0aW1hdGVzIGJ5IGVjb3N5c3RlbSAoZWNvKSIsCiMgICAgICAgICAgICAgIGFsaWduID0gImMiKQpgYGAKCmBgYHtyIHBsb3QtbW9kRml0LXBhcnN9CiMjIHBsb3QgcGFycwpwYXIucGxvdC5meCA8LSBmdW5jdGlvbihtb2QsIGRlcHRoLCBwYXIuZGYsIGluaXRpYWwgPSBGQUxTRSkgewogIHBhci5kZiAlPiUKICAgIHsgaWYgKGluaXRpYWwgPT0gVFJVRSkgLiBlbHNlIGZpbHRlciguLCBlc3QgPT0gImZpdCIpIH0gJT4lCiAgICBmaWx0ZXIoZGVwdGggPT0gZGVwdGgpICU+JQogICAgcGl2b3RfbG9uZ2VyKCEoZXN0OmRlcHRoKSwgbmFtZXNfdG8gPSAicGFyIiwgdmFsdWVzX3RvID0gInZhbHVlIikgJT4lCiAgICBtdXRhdGUoUE0gPSBmYWN0b3IoUE0pLAogICAgICAgICAgIGVjbyA9IGZhY3RvcihlY28sIGxldmVscyA9IGMoInBwIiwgIndmIiwgInJmIikpKSAlPiUKICAgIGdncGxvdCguLCBhZXMocGFyLCB2YWx1ZSwgY29sb3IgPSBQTSwgc2hhcGUgPSBlY28pKSArCiAgICAjIGdlb21faml0dGVyKHNpemUgPSA0KSArCiAgICBnZW9tX3BvaW50KHNpemUgPSA0LCBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gLjUpKSArCiAgICBzY2FsZV9jb2xvcl9tYW51YWwobmFtZSA9ICJwYXJlbnQgbWF0ZXJpYWwiLAogICAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiQU4iID0gImFuZGVzaXRlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJTIiA9ICJiYXNhbHQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR1IiID0gImdyYW5pdGUiKSwKICAgICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoIkFOIiA9ICJibHVlIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCUyIgPSAicmVkIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHUiIgPSAiZGFya2dyYXkiKSkgKwogICAgZmFjZXRfd3JhcCguIH4gcGFyLCBzY2FsZXMgPSAiZnJlZSIpICsKICAgIGdndGl0bGUocGFzdGUwKCJtb2RGaXQgcGFycyAiLCBtb2QsICIgMC0xMCBjbSIpKSArCiAgICB0aGVtZV9idygpICsKICAgIHRoZW1lKHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpCn0KIyAwLTEwCiMgMnBwCnBhci5wbG90LmZ4KG1vZCA9ICIycHAiLAogICAgICAgICAgICBkZXB0aCA9ICIwLTEwIiwKICAgICAgICAgICAgcGFyLmRmID0gcGFycy5maXQuMnBwLmRmLAogICAgICAgICAgICBpbml0aWFsID0gRkFMU0UpCiMgMnBzCnBhci5wbG90LmZ4KG1vZCA9ICIycHMiLAogICAgICAgICAgICBkZXB0aCA9ICIwLTEwIiwKICAgICAgICAgICAgcGFyLmRmID0gcGFycy5maXQuMnBzLmRmLAogICAgICAgICAgICBpbml0aWFsID0gRkFMU0UpCiMgMnBwLCBnYW0gPSBbLjUsLjk1XQpwYXIucGxvdC5meChtb2QgPSAiMnBwIChnYW0gPSBbMC41LCAwLjk1XSkiLAogICAgICAgICAgICBkZXB0aCA9ICIwLTEwIiwKICAgICAgICAgICAgcGFyLmRmID0gcGFycy5maXQuMnBwLnAzLjUuOTUuZGYsCiAgICAgICAgICAgIGluaXRpYWwgPSBGQUxTRSkKYGBgCgpgYGB7ciBmeC1maXQtc29jLWlufQojIyBhZGp1c3QgaW5wdXRzIHRvIG1hdGNoIG1vZGVsZWQgc3RvY2tzCiMgZnVuY3Rpb24gZm9yIGNhbGN1bGF0aW5nIHN0ZWFkeS1zdGF0ZSBTT0Mgc3RvY2tzCnNvYy5meCA8LSBmdW5jdGlvbihwYXJzLCBJbikgewogIGNvbFN1bXMoLTEgKiBzb2x2ZSgtMSAqIGRpYWcocGFyc1sxOjJdKSkgJSolIGMoSW4gKiBwYXJzWzNdLCBJbiAqICgxIC0gcGFyc1szXSkpKQp9Cgppbi5maXQuZnggPC0gZnVuY3Rpb24ocGFycywgaW5pdGlhbEluLCBTT0MpIHsKICAjIHNlcXVlbmNlIG9mIHBvc3NpYmxlIGlucHV0IHZhbHVlcwogIGlmICAoU09DIDwgc29jLmZ4KHBhcnMsIGluaXRpYWxJbikpIHsKICAgIGlucyA8LSBzZXEoLjAxLCAKICAgICAgICAgICAgICAgaW5pdGlhbEluLCAKICAgICAgICAgICAgICAgLjAxKQogICAgfSBlbHNlIHsKICAgICAgaW5zIDwtIHNlcShpbml0aWFsSW4sIAogICAgICAgICAgICAgICAgIFNPQywgCiAgICAgICAgICAgICAgICAgLjAxKQogICAgfQogICMgbW9kZWxlZCBzdG9ja3MKICBzb2NfbW9kIDwtIGxhcHBseShzZXFfYWxvbmcoaW5zKSwgZnVuY3Rpb24oaikgewogICAgc29jLmZ4KHBhcnMsIGluc1tqXSkKICB9KQogIGl4IDwtIHdoaWNoLm1pbihhYnModW5saXN0KHNvY19tb2QpIC0gU09DKSkKICByZXR1cm4oaW5zW2l4XSkKfQpgYGAKCmBgYHtyIGZpdC1zb2MtaW59CiMjIEZpbmQgYmVzdCBpbnB1dHMKIyAycHAKaW4uZml0LjJwcCA8LSBsYXBwbHkoc2VxX2Fsb25nKHBhcnMuZml0LjJwcCksIGZ1bmN0aW9uKGkpIHsKICBQTWVjb19kZXB0aCA8LSBuYW1lcyhwYXJzLmZpdC4ycHApW2ldCiAgU09DIDwtIGNzb2MuMTkuMF8zMFtbUE1lY29fZGVwdGhdXVsgLCJseXJfc29jIl0KICByZXR1cm4oaW4uZml0LmZ4KHBhcnMuZml0LjJwcFtbaV1dLCBpbi5pW2l4LjEwXVtbaV1dLCBTT0MpKQp9KQpuYW1lcyhpbi5maXQuMnBwKSA8LSBuYW1lcyhtb2QuZml0cy4ycHApCiMgMnBwIGdhbSA9IFsuNSwgLjk1XQppbi5maXQuMnBwLnAzLjUuOTUgPC0gbGFwcGx5KHNlcV9hbG9uZyhwYXJzLmZpdC4ycHAucDMuNS45NSksIGZ1bmN0aW9uKGkpIHsKICBQTWVjb19kZXB0aCA8LSBuYW1lcyhwYXJzLmZpdC4ycHAucDMuNS45NSlbaV0KICBTT0MgPC0gY3NvYy4xOS4wXzMwW1tQTWVjb19kZXB0aF1dWyAsImx5cl9zb2MiXQogIHJldHVybihpbi5maXQuZngocGFycy5maXQuMnBwLnAzLjUuOTVbW2ldXSwgaW4uaVtpeC4xMF1bW2ldXSwgU09DKSkKfSkKbmFtZXMoaW4uZml0LjJwcC5wMy41Ljk1KSA8LSBuYW1lcyhtb2QuZml0cy4ycHAucDMuNS45NSkKIyAycHMKaW4uZml0LjJwcyA8LSBsYXBwbHkoc2VxX2Fsb25nKHBhcnMuZml0LjJwcyksIGZ1bmN0aW9uKGkpIHsKICBQTWVjb19kZXB0aCA8LSBuYW1lcyhwYXJzLmZpdC4ycHMpW2ldCiAgU09DIDwtIGNzb2MuMTkuMF8zMFtbUE1lY29fZGVwdGhdXVsgLCJseXJfc29jIl0KICByZXR1cm4oaW4uZml0LmZ4KHBhcnMuZml0LjJwc1tbaV1dLCBpbi5pW2l4LjEwXVtbaV1dLCBTT0MpKQp9KQpuYW1lcyhpbi5maXQuMnBzKSA8LSBuYW1lcyhtb2QuZml0cy4ycHMpCgojIyBDYWxjIG1vZGVsZWQgc3RvY2tzIGFuZCBjb21wYXJlIHdpdGggbWVhc3VyZWQgc3RvY2tzCiMgMnBwCm1vZC5zb2NzLjJwcC5scyA8LSBsYXBwbHkoc2VxX2Fsb25nKHBhcnMuZml0LjJwcCksIGZ1bmN0aW9uKGkpIHsKICBBIDwtIC0xICogZGlhZyhwYXJzLmZpdC4ycHBbW2ldXVsxOjJdKQogIHJldHVybigtMSAqIHNvbHZlKEEpICUqJSBjKGluLmZpdC4ycHBbW2ldXSAqIHBhcnMuZml0LjJwcFtbaV1dWzNdLCBpbi5maXQuMnBwW1tpXV0gKiAoMSAtIHBhcnMuZml0LjJwcFtbaV1dWzNdKSkpCn0pCm5hbWVzKG1vZC5zb2NzLjJwcC5scykgPC0gbmFtZXMocGFycy5maXQuMnBwKQpzb2NzLjJwcC5scyA8LSBtYXBwbHkoY2JpbmQsCiAgICAgICAgICAgICAgICAgICAgICBjc29jLjE5LjBfMzBbaXguMTBdLCAKICAgICAgICAgICAgICAgICAgICAgIGxhcHBseShtb2Quc29jcy4ycHAubHMsIGNvbFN1bXMpLCAKICAgICAgICAgICAgICAgICAgICAgIFNJTVBMSUZZID0gRkFMU0UpCiMgMnBwIGdhbSA9IFsuNSwgLjk1XQptb2Quc29jcy4ycHAucDMuNS45NS5scyA8LSBsYXBwbHkoc2VxX2Fsb25nKHBhcnMuZml0LjJwcC5wMy41Ljk1KSwgZnVuY3Rpb24oaSkgewogIEEgPC0gLTEgKiBkaWFnKHBhcnMuZml0LjJwcC5wMy41Ljk1W1tpXV1bMToyXSkKICByZXR1cm4oLTEgKiBzb2x2ZShBKSAlKiUgYyhpbi5maXQuMnBwLnAzLjUuOTVbW2ldXSAqIHBhcnMuZml0LjJwcC5wMy41Ljk1W1tpXV1bM10sIGluLmZpdC4ycHAucDMuNS45NVtbaV1dICogKDEgLSBwYXJzLmZpdC4ycHAucDMuNS45NVtbaV1dWzNdKSkpCn0pCm5hbWVzKG1vZC5zb2NzLjJwcC5wMy41Ljk1LmxzKSA8LSBuYW1lcyhwYXJzLmZpdC4ycHAucDMuNS45NSkKc29jcy4ycHAucDMuNS45NWxzIDwtIG1hcHBseShjYmluZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjc29jLjE5LjBfMzBbaXguMTBdLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXBwbHkobW9kLnNvY3MuMnBwLnAzLjUuOTUubHMsIGNvbFN1bXMpLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTSU1QTElGWSA9IEZBTFNFKQojIDJwcwptb2Quc29jcy4ycHMubHMgPC0gbGFwcGx5KHNlcV9hbG9uZyhwYXJzLmZpdC4ycHMpLCBmdW5jdGlvbihpKSB7CiAgQSA8LSAtMSAqIGRpYWcocGFycy5maXQuMnBzW1tpXV1bMToyXSkKICByZXR1cm4oLTEgKiBzb2x2ZShBKSAlKiUgYyhpbi5maXQuMnBzW1tpXV0gKiBwYXJzLmZpdC4ycHNbW2ldXVszXSwgaW4uZml0LjJwc1tbaV1dICogKDEgLSBwYXJzLmZpdC4ycHNbW2ldXVszXSkpKQp9KQpuYW1lcyhtb2Quc29jcy4ycHMubHMpIDwtIG5hbWVzKHBhcnMuZml0LjJwcykKc29jcy4ycHMubHMgPC0gbWFwcGx5KGNiaW5kLAogICAgICAgICAgICAgICAgICAgICAgY3NvYy4xOS4wXzMwW2l4LjEwXSwgCiAgICAgICAgICAgICAgICAgICAgICBsYXBwbHkobW9kLnNvY3MuMnBzLmxzLCBjb2xTdW1zKSwgCiAgICAgICAgICAgICAgICAgICAgICBTSU1QTElGWSA9IEZBTFNFKQoKIyMgUmV0dXJuIGRhdGEgZnJhbWVzIG9mIG1vZGVsIGZpdHMgd2l0aCBhZGp1c3RlZCBpbnB1dHMgYW5kIG9wdGltYWwgcGFyYW1ldGVycwojIDJwcApUd29wcC5maXRzIDwtIGxhcHBseShzZXFfYWxvbmcocGFycy5maXQuMnBwKSwgZnVuY3Rpb24oaSkgewogIHBhci5meChwYXJzLmZpdC4ycHBbW2ldXSwgaW4uZml0LjJwcFtbaV1dLCB2ZXJib3NlID0gRkFMU0UsIG1vZCA9ICIycHAiKQp9KQpuYW1lcyhUd29wcC5maXRzKSA8LSBuYW1lcyhwYXJzLmZpdC4ycHApCiMgMnBwIGdhbSA9IFsuNSwgLjk1XQpUd29wcC5wMy41Ljk1LmZpdHMgPC0gbGFwcGx5KHNlcV9hbG9uZyhwYXJzLmZpdC4ycHAucDMuNS45NSksIGZ1bmN0aW9uKGkpIHsKICBwYXIuZngocGFycy5maXQuMnBwLnAzLjUuOTVbW2ldXSwgaW4uZml0LjJwcC5wMy41Ljk1W1tpXV0sIHZlcmJvc2UgPSBGQUxTRSwgbW9kID0gIjJwcCIpCn0pCm5hbWVzKFR3b3BwLnAzLjUuOTUuZml0cykgPC0gbmFtZXMocGFycy5maXQuMnBwLnAzLjUuOTUpCiMgMnBzClR3b3BzLmZpdHMgPC0gbGFwcGx5KHNlcV9hbG9uZyhwYXJzLmZpdC4ycHMpLCBmdW5jdGlvbihpKSB7CiAgcGFyLmZ4KHBhcnMuZml0LjJwc1tbaV1dLCBpbi5maXQuMnBzW1tpXV0sIHZlcmJvc2UgPSBGQUxTRSwgbW9kID0gIjJwcyIpCn0pCm5hbWVzKFR3b3BzLmZpdHMpIDwtIG5hbWVzKHBhcnMuZml0LjJwcykKYGBgCgpgYGB7ciBwbG90LXNvYy1zdG9ja3N9CiMgUGxvdCBvcHRpbWl6ZWQgbW9kZWwgU09DIHN0b2Nrcwptb2Quc29jcy5kZi5meCA8LSBmdW5jdGlvbihtb2QsIG1vZC5zb2NzLmxzLCBwb29scykgewogIG4gPC0gdmFwcGx5KG1vZC5zb2NzLmxzLCBucm93LCBudW1lcmljKDEpKQogIHJldHVybihkYXRhLmZyYW1lKFNPQyA9IGRvLmNhbGwocmJpbmQsIG1vZC5zb2NzLmxzKSwKICAgICAgICAgICAgICAgICAgICBwb29sID0gcmVwKHBvb2xzLCBsZW5ndGgobW9kLnNvY3MubHMpKSwKICAgICAgICAgICAgICAgICAgICBQTWVjb19kZXB0aCA9IHJlcChuYW1lcyhtb2Quc29jcy5scyksIG4pLAogICAgICAgICAgICAgICAgICAgIE1vZGVsID0gcmVwKG1vZCwgc3VtKG4pKSkpICAgICAgIAp9CiMgcnVuIGZ4Cm1vZC5zb2NzLjJwLmRmIDwtIHJiaW5kKG1vZC5zb2NzLmRmLmZ4KCIycHAiLCBtb2Quc29jcy4ycHAubHMsIGMoImZhc3QiLCAic2xvdyIpKSwKICAgICAgICAgICAgICAgICAgICAgICAgbW9kLnNvY3MuZGYuZngoIjJwcyIsIG1vZC5zb2NzLjJwcy5scywgYygiZmFzdCIsICJzbG93IikpCiAgICAgICAgICAgICAgICAgICAgICAgICMgLG1vZC5zb2NzLmRmLmZ4KCIycHAgWy41LC45NV0iLCBtb2Quc29jcy4ycHAucDMuNS45NS5scywgYygiZmFzdCIsICJzbG93IikpCiAgICAgICAgICAgICAgICAgICAgICAgICkKCiMgcGxvdAptb2Quc29jcy4ycC5kZiAlPiUKICBtdXRhdGUoUE0gPSBzdWJzdHIoUE1lY29fZGVwdGgsIDEsIDIpLAogICAgICAgICBlY28gPSBzdWJzdHIoUE1lY29fZGVwdGgsIDMsIDQpKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKHBvb2wsIFNPQywgZmlsbCA9IE1vZGVsKSkgKwogIGdlb21fY29sKHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2UoKSkgKwogIGZhY2V0X2dyaWQocm93cyA9IHZhcnMoZWNvKSwgY29scyA9IHZhcnMoUE0pKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSkKYGBgCgpgYGB7ciBwbG90LW9wdC1tb2QtMnBwfQojIHBsb3QgZngKVHdvcC5maXQucGxvdC5meCA8LSBmdW5jdGlvbihmaXQxLCBmaXQxLm5hbWUsIGZpdDIsIGZpdDIubmFtZSwgZml0MyA9IE5VTEwsIGZpdDMubmFtZSA9IE5VTEwpIHsKICBsYXBwbHkoc2VxX2Fsb25nKGZpdDEpLCBmdW5jdGlvbihpKSB7CiAgICBQTWVjbyA8LSBzdWJzdHIobmFtZXMoZml0MSlbaV0sIDEsIDQpCiAgICBseXJfYm90IDwtIHN1YnN0cihuYW1lcyhmaXQxKVtpXSwgCiAgICAgICAgICAgICAgICAgICAgICBuY2hhcihuYW1lcyhmaXQxKVtpXSkgLSAxLCAKICAgICAgICAgICAgICAgICAgICAgIG5jaGFyKG5hbWVzKGZpdDEpW2ldKSkKICAgIGx5cl90b3AgPC0gaWZlbHNlKGx5cl9ib3QgPT0gMTAsIDAsIGlmZWxzZShseXJfYm90ID09IDIwLCAxMCwgMjApKQogICAgY29uLmRmIDwtIGNvbi5kZi5meChQTWVjbywgbHlyX2JvdCkKICAgIHBsb3QuZGYgPC0gcmJpbmQoZml0MVtbaV1dLAogICAgICAgICAgICAgICAgICAgICBmaXQyW1tpXV0sCiAgICAgICAgICAgICAgICAgICAgIGZpdDNbW2ldXSkKICAgIHBsb3QuZGYkTW9kZWwgPC0gZmFjdG9yKGMocmVwKGZpdDEubmFtZSwgbnJvdyhmaXQxW1tpXV0pKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwKGZpdDIubmFtZSwgbnJvdyhmaXQyW1tpXV0pKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwKGZpdDMubmFtZSwgbnJvdyhmaXQzW1tpXV0pKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXZlbHMgPSBjKGZpdDEubmFtZSwgZml0Mi5uYW1lLCBmaXQzLm5hbWUpKQogICAgcmV0dXJuKHBsb3QuZGYgJT4lCiAgICAgICAgICAgICBmaWx0ZXIocG9vbCA9PSAiYnVsayBDIiB8IHBvb2wgPT0gInJlc3BpcmF0aW9uIiB8IHBvb2wgPT0gImF0bSIpICU+JQogICAgICAgICAgICAgZ2dwbG90KC4sIGFlcyh5ZWFycywgZDE0QywgY29sb3IgPSBwb29sKSkgKwogICAgICAgICAgICAgZ2VvbV9wYXRoKGFlcyhsaW5ldHlwZSA9IE1vZGVsKSkgKwogICAgICAgICAgICAgZ2VvbV9lcnJvcmJhcihkYXRhID0gY29uLmRmLAogICAgICAgICAgICAgICAgICAgICAgICAgICBhZXMoeCA9IFllYXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB5bWluID0gZDE0Y19sLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHltYXggPSBkMTRjX3UsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sb3IgPSBwb29sKSwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoID0gLjEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaGVyaXQuYWVzID0gRkFMU0UpICsKICAgICAgICAgICAgIGdlb21fcG9pbnQoZGF0YSA9IGNvbi5kZiwgYWVzKFllYXIsIGQxNGMsIGNvbG9yID0gcG9vbCksIHNpemUgPSAzKSArCiAgICAgICAgICAgICBzY2FsZV9jb2xvcl9tYW51YWwoCiAgICAgICAgICAgICAgIG5hbWUgPSAiTW9kZWwgcG9vbCIsCiAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoImF0bSIgPSA4LAogICAgICAgICAgICAgICAgICAgICAgICAgICJidWxrIEMiID0gImJsYWNrIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAiZmFzdCIgPSAiI0Q4MUI2MCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgInNsb3ciID0gIiMxRTg4RTUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICJyZXNwaXJhdGlvbiIgPSAiI0ZGQzEwNyIpKSArCiAgICAgICAgICAgICBzY2FsZV94X2NvbnRpbnVvdXMobGltaXRzID0gYygxOTUwLCAyMDIyKSkgKwogICAgICAgICAgICAgZ2d0aXRsZShwYXN0ZTAoUE1lY28sICJfIiwgbHlyX3RvcCwgIi0iLCBseXJfYm90LCAiIDJwIG1vZCBmaXRzIikpICsKICAgICAgICAgICAgIHhsYWIoIlllYXIiKSArCiAgICAgICAgICAgICB5bGFiKGV4cHJlc3Npb24oJycqRGVsdGEqJydeMTQqJ0MgKOKAsCknKSkgKwogICAgICAgICAgICAgdGhlbWVfYncoKSArCiAgICAgICAgICAgICB0aGVtZShwYW5lbC5ncmlkID0gZWxlbWVudF9ibGFuaygpKSkKICB9KQp9CiMgMnAgbW9kRml0IG9wdGltYWwgbW9kZWwgY29tcGFyaXNvbgpUd29wLmZpdHMucGxvdHMgPC0gVHdvcC5maXQucGxvdC5meChUd29wcC5maXRzLCAiMnBwIiwgVHdvcHMuZml0cywgIjJwcyIpClR3b3AuZml0cy5wbG90cwojIFR3b3AuZml0cy5wbG90czIgPC0gVHdvcC5maXQucGxvdC5meChUd29wcy5maXRzLCAiMnBzIiwgVHdvcHAuZml0cywgIjJwcCIsIFR3b3BwLnAzLjUuOTUuZml0cywgIjJwcCBnYW0gPSBbLjUsIC45NV0iKQojIFR3b3AuZml0cy5wbG90czIKYGBgCgpgYGB7ciBtb2RGaXQtMnAtY29tcGFyaXNvbn0KIyBjb21wYXJlIG91dHB1dCBvZiAycHAgYW5kIDJwcyBtb2RlbCBmaXRzCm1lcmdlKHNzci4ycHAuZGYsIHNzci4ycHMuZGYsIGJ5ID0gIlBNZWNvX2RlcHRoIiwgc3VmZml4ZXMgPSBjKCJfMnBwIiwgIl8ycHMiKSkgJT4lCiAgbXV0YXRlKHNzcl8ycHAgPSByb3VuZChzc3JfMnBwLCAxKSwKICAgICAgICAgc3NyXzJwcyA9IHJvdW5kKHNzcl8ycHMsIDEpLAogICAgICAgICBkaWYgPSBzc3JfMnBwIC0gc3NyXzJwcykKbWVyZ2UodmFyX21zLjJwcC5kZiwKICAgICAgdmFyX21zLjJwcy5kZiwKICAgICAgYnkgPSBjKCJQTWVjb19kZXB0aCIsICJ2YXIiKSwKICAgICAgc3VmZml4ZXMgPSBjKCJfMnBwIiwgIl8ycHMiKSkgJT4lCiAgbXV0YXRlKHZhcl9tc18ycHAgPSByb3VuZCh2YXJfbXNfMnBwLCA0KSwKICAgICAgICAgdmFyX21zXzJwcyA9IHJvdW5kKHZhcl9tc18ycHMsIDQpLAogICAgICAgICBkaWYgPSB2YXJfbXNfMnBwIC0gdmFyX21zXzJwcykKCiMjIFBsb3QKIyBTU1IsIFBNCnJiaW5kKHNzci4ycHAuZGYsIHNzci4ycHMuZGYpICU+JQogIG11dGF0ZShtb2QgPSByZXAoYygiMnBwIiwgIjJwcyIpLCBlYWNoID0gbnJvdyhzc3IuMnBwLmRmKSksCiAgICAgICAgIFBNID0gc3Vic3RyKFBNZWNvX2RlcHRoLCAxLCAyKSwKICAgICAgICAgZWNvID0gc3Vic3RyKFBNZWNvX2RlcHRoLCAzLCA0KSkgJT4lCiAgZ3JvdXBfYnkoUE0sIG1vZCkgJT4lCiAgc3VtbWFyaXplKG1lYW4uc3NyID0gbWVhbihzc3IpLCBzZCA9IHNkKHNzcikpICU+JQogIG11dGF0ZShlcnJfdSA9IG1lYW4uc3NyICsgc2Qvc3FydCgzKSwKICAgICAgICAgZXJyX2wgPSBtZWFuLnNzciAtIHNkL3NxcnQoMykpICU+JQogIGdncGxvdCguLCBhZXMobW9kLCBtZWFuLnNzciwgZmlsbCA9IFBNKSkgKwogIGdlb21fY29sKHBvc2l0aW9uID0gImRvZGdlIikgKwogIGdlb21fZXJyb3JiYXIoCiAgICBhZXMoeW1heCA9IGVycl91LCB5bWluID0gZXJyX2wpLCAKICAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAuOSksCiAgICB3aWR0aCA9IC4zKSArCiAgc2NhbGVfZmlsbF9tYW51YWwobmFtZSA9ICJQYXJlbnQgbWF0ZXJpYWwiLAogICAgICAgICAgICAgICAgICAgIGxhYmVscyA9IGMoIkFOIiA9ICJhbmRlc2l0ZSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQlMiID0gImJhc2FsdCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR1IiID0gImdyYW5pdGUiKSwKICAgICAgICAgICAgICAgICAgICB2YWx1ZXMgPSBjKCJBTiIgPSAiYmx1ZSIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJTIiA9ICJyZWQiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHUiIgPSAiZGFya2dyYXkiKSkgKwogIGZhY2V0X3dyYXAoLiB+IFBNKSArCiAgZ2d0aXRsZSgiU1NSIDItcG9vbCBtb2RlbHMgMC0xMCBjbSIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpKQojIFNTUiwgZWNvCnJiaW5kKHNzci4ycHAuZGYsIHNzci4ycHMuZGYpICU+JQogIG11dGF0ZShtb2QgPSByZXAoYygiMnBwIiwgIjJwcyIpLCBlYWNoID0gbnJvdyhzc3IuMnBwLmRmKSksCiAgICAgICAgIFBNID0gc3Vic3RyKFBNZWNvX2RlcHRoLCAxLCAyKSwKICAgICAgICAgZWNvID0gc3Vic3RyKFBNZWNvX2RlcHRoLCAzLCA0KSkgJT4lCiAgZ3JvdXBfYnkoZWNvLCBtb2QpICU+JQogIHN1bW1hcml6ZShtZWFuLnNzciA9IG1lYW4oc3NyKSwgc2QgPSBzZChzc3IpKSAlPiUKICBtdXRhdGUoZXJyX3UgPSBtZWFuLnNzciArIHNkL3NxcnQoMyksCiAgICAgICAgIGVycl9sID0gbWVhbi5zc3IgLSBzZC9zcXJ0KDMpKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKG1vZCwgbWVhbi5zc3IsIGZpbGwgPSBlY28pKSArCiAgZ2VvbV9jb2wocG9zaXRpb24gPSAiZG9kZ2UiKSArCiAgZ2VvbV9lcnJvcmJhcigKICAgIGFlcyh5bWF4ID0gZXJyX3UsIHltaW4gPSBlcnJfbCksIAogICAgcG9zaXRpb24gPSBwb3NpdGlvbl9kb2RnZSh3aWR0aCA9IC45KSwKICAgIHdpZHRoID0gLjMpICsKICBmYWNldF93cmFwKC4gfiBlY28pICsKICBnZ3RpdGxlKCJTU1IgMi1wb29sIG1vZGVscyAwLTEwIGNtIChlY28pIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpCgojIHZhcl9tcywgUE0KcmJpbmQodmFyX21zLjJwcC5kZiwgdmFyX21zLjJwcy5kZikgJT4lCiAgbXV0YXRlKG1vZCA9IHJlcChjKCIycHAiLCAiMnBzIiksIGVhY2ggPSBucm93KHZhcl9tcy4ycHAuZGYpKSwKICAgICAgICAgUE0gPSBzdWJzdHIoUE1lY29fZGVwdGgsIDEsIDIpLAogICAgICAgICBlY28gPSBzdWJzdHIoUE1lY29fZGVwdGgsIDMsIDQpKSAlPiUKICBncm91cF9ieSh2YXIsIFBNLCBtb2QpICU+JQogIHN1bW1hcml6ZShtZWFuLnZhcl9tcyA9IG1lYW4odmFyX21zKSwgc2QgPSBzZCh2YXJfbXMpKSAlPiUKICBtdXRhdGUoZXJyX3UgPSBtZWFuLnZhcl9tcyArIHNkL3NxcnQoMyksCiAgICAgICAgIGVycl9sID0gbWVhbi52YXJfbXMgLSBzZC9zcXJ0KDMpKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKG1vZCwgbWVhbi52YXJfbXMsIGZpbGwgPSBQTSkpICsKICBnZW9tX2NvbChwb3NpdGlvbiA9ICJkb2RnZSIpICsKICBnZW9tX2Vycm9yYmFyKAogICAgYWVzKHltYXggPSBlcnJfdSwgeW1pbiA9IGVycl9sKSwgCiAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gLjkpLAogICAgd2lkdGggPSAuMykgKwogIHNjYWxlX2ZpbGxfbWFudWFsKG5hbWUgPSAiUGFyZW50IG1hdGVyaWFsIiwKICAgICAgICAgICAgICAgICAgICBsYWJlbHMgPSBjKCJBTiIgPSAiYW5kZXNpdGUiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJTIiA9ICJiYXNhbHQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdSIiA9ICJncmFuaXRlIiksCiAgICAgICAgICAgICAgICAgICAgdmFsdWVzID0gYygiQU4iID0gImJsdWUiLCAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCUyIgPSAicmVkIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiR1IiID0gImRhcmtncmF5IikpICsKICBmYWNldF93cmFwKC4gfiB2YXIsIHNjYWxlcyA9ICJmcmVlIikgKwogIGdndGl0bGUoIlJlc2lkdWFsIGVycm9yIDItcG9vbCBtb2RlbHMgMC0xMCBjbSIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpKQojIHZhcl9tcywgZWNvCnJiaW5kKHZhcl9tcy4ycHAuZGYsIHZhcl9tcy4ycHMuZGYpICU+JQogIG11dGF0ZShtb2QgPSByZXAoYygiMnBwIiwgIjJwcyIpLCBlYWNoID0gbnJvdyh2YXJfbXMuMnBwLmRmKSksCiAgICAgICAgIFBNID0gc3Vic3RyKFBNZWNvX2RlcHRoLCAxLCAyKSwKICAgICAgICAgZWNvID0gc3Vic3RyKFBNZWNvX2RlcHRoLCAzLCA0KSkgJT4lCiAgZ3JvdXBfYnkodmFyLCBlY28sIG1vZCkgJT4lCiAgc3VtbWFyaXplKG1lYW4udmFyX21zID0gbWVhbih2YXJfbXMpLCBzZCA9IHNkKHZhcl9tcykpICU+JQogIG11dGF0ZShlcnJfdSA9IG1lYW4udmFyX21zICsgc2Qvc3FydCgzKSwKICAgICAgICAgZXJyX2wgPSBtZWFuLnZhcl9tcyAtIHNkL3NxcnQoMykpICU+JQogIGdncGxvdCguLCBhZXMobW9kLCBtZWFuLnZhcl9tcywgZmlsbCA9IGVjbykpICsKICBnZW9tX2NvbChwb3NpdGlvbiA9ICJkb2RnZSIpICsKICBnZW9tX2Vycm9yYmFyKAogICAgYWVzKHltYXggPSBlcnJfdSwgeW1pbiA9IGVycl9sKSwgCiAgICBwb3NpdGlvbiA9IHBvc2l0aW9uX2RvZGdlKHdpZHRoID0gLjkpLAogICAgd2lkdGggPSAuMykgKwogIGZhY2V0X3dyYXAoLiB+IHZhciwgc2NhbGVzID0gImZyZWUiKSArCiAgZ2d0aXRsZSgiUmVzaWR1YWwgZXJyb3IgMi1wb29sIG1vZGVscyAwLTEwIGNtIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpCmBgYAoKYGBge3IgYWdlcy10dC1tb2RGaXR9CiMjIFN5c3RlbSBhZ2UKIyAycHAKU0EuMnBwLmxzIDwtIGxhcHBseShzZXFfYWxvbmcocGFycy5maXQuMnBwKSwgZnVuY3Rpb24oaSkgewogIGtzIDwtIHBhcnMuZml0LjJwcFtbaV1dWzE6Ml0KICBnYW0gPC0gcGFycy5maXQuMnBwW1tpXV1bM10KICBJbiA8LSBpbi5maXQuMnBwW1tpXV0KICByZXR1cm4oc3lzdGVtQWdlKEEgPSAtMSAqIGRpYWcoa3MpLCB1ID0gYyhJbiAqIGdhbSwgSW4gKiAoMSAtIGdhbSkpKSkKfSkKbmFtZXMoU0EuMnBwLmxzKSA8LSBuYW1lcyhwYXJzLmZpdC4ycHApCiMgMnBwIGdhbSA9IFsuNSwgLjk1XQpTQS4ycHAucDMuNS45NS5scyA8LSBsYXBwbHkoc2VxX2Fsb25nKHBhcnMuZml0LjJwcC5wMy41Ljk1KSwgZnVuY3Rpb24oaSkgewogIGtzIDwtIHBhcnMuZml0LjJwcC5wMy41Ljk1W1tpXV1bMToyXQogIGdhbSA8LSBwYXJzLmZpdC4ycHAucDMuNS45NVtbaV1dWzNdCiAgSW4gPC0gaW4uZml0LjJwcC5wMy41Ljk1W1tpXV0KICByZXR1cm4oc3lzdGVtQWdlKEEgPSAtMSAqIGRpYWcoa3MpLCB1ID0gYyhJbiAqIGdhbSwgSW4gKiAoMSAtIGdhbSkpKSkKfSkKbmFtZXMoU0EuMnBwLnAzLjUuOTUubHMpIDwtIG5hbWVzKHBhcnMuZml0LjJwcC5wMy41Ljk1KQojIDJwcwpTQS4ycHMubHMgPC0gbGFwcGx5KHNlcV9hbG9uZyhwYXJzLmZpdC4ycHMpLCBmdW5jdGlvbihpKSB7CiAga3MgPC0gcGFycy5maXQuMnBzW1tpXV1bMToyXQogIGdhbSA8LSBwYXJzLmZpdC4ycHNbW2ldXVszXQogIEluIDwtIGluLmZpdC4ycHNbW2ldXQogIHJldHVybihzeXN0ZW1BZ2UoQSA9IC0xICogZGlhZyhrcyksIHUgPSBjKEluICogZ2FtLCBJbiAqICgxIC0gZ2FtKSkpKQp9KQpuYW1lcyhTQS4ycHMubHMpIDwtIG5hbWVzKHBhcnMuZml0LjJwcykKCiMjIFRyYW5zaXQgdGltZQojIDJwcApUVC4ycHAubHMgPC0gbGFwcGx5KHNlcV9hbG9uZyhwYXJzLmZpdC4ycHApLCBmdW5jdGlvbihpKSB7CiAga3MgPC0gcGFycy5maXQuMnBwW1tpXV1bMToyXQogIGdhbSA8LSBwYXJzLmZpdC4ycHBbW2ldXVszXQogIEluIDwtIGluLmZpdC4ycHBbW2ldXQogIHJldHVybih0cmFuc2l0VGltZShBID0gLTEgKiBkaWFnKGtzKSwgdSA9IGMoSW4gKiBnYW0sIEluICogKDEgLSBnYW0pKSkpCn0pCm5hbWVzKFRULjJwcC5scykgPC0gbmFtZXMocGFycy5maXQuMnBwKQojIDJwcCBnYW0gPSBbLjUsIC45NV0KVFQuMnBwLnAzLjUuOTUubHMgPC0gbGFwcGx5KHNlcV9hbG9uZyhwYXJzLmZpdC4ycHAucDMuNS45NSksIGZ1bmN0aW9uKGkpIHsKICBrcyA8LSBwYXJzLmZpdC4ycHAucDMuNS45NVtbaV1dWzE6Ml0KICBnYW0gPC0gcGFycy5maXQuMnBwLnAzLjUuOTVbW2ldXVszXQogIEluIDwtIGluLmZpdC4ycHAucDMuNS45NVtbaV1dCiAgcmV0dXJuKHRyYW5zaXRUaW1lKEEgPSAtMSAqIGRpYWcoa3MpLCB1ID0gYyhJbiAqIGdhbSwgSW4gKiAoMSAtIGdhbSkpKSkKfSkKbmFtZXMoVFQuMnBwLnAzLjUuOTUubHMpIDwtIG5hbWVzKHBhcnMuZml0LjJwcC5wMy41Ljk1KQojIDJwcwpUVC4ycHMubHMgPC0gbGFwcGx5KHNlcV9hbG9uZyhwYXJzLmZpdC4ycHMpLCBmdW5jdGlvbihpKSB7CiAga3MgPC0gcGFycy5maXQuMnBzW1tpXV1bMToyXQogIGdhbSA8LSBwYXJzLmZpdC4ycHNbW2ldXVszXQogIEluIDwtIGluLmZpdC4ycHNbW2ldXQogIHJldHVybih0cmFuc2l0VGltZShBID0gLTEgKiBkaWFnKGtzKSwgdSA9IGMoSW4gKiBnYW0sIEluICogKDEgLSBnYW0pKSkpCn0pCm5hbWVzKFRULjJwcy5scykgPC0gbmFtZXMocGFycy5maXQuMnBzKQpgYGAKCmBgYHtyIFNBLVRULWNvbXB9CiMgY29tcGFyZSBhZ2VzIGFuZCB0cmFuc2l0IHRpbWVzIGFtb25nIHRoZSB0d28gbW9kZWwgc3RydWN0dXJlcwpTQS4ycC5scyA8LSBsaXN0KFNBLjJwcC5scywgU0EuMnBzLmxzLCBTQS4ycHAucDMuNS45NS5scykKU0EuZGYgPC0gYmluZF9yb3dzKAogIGxhcHBseShTQS4ycC5scywgZnVuY3Rpb24obHMpIHsKICAgIGxhcHBseShzZXFfYWxvbmcobHMpLCBmdW5jdGlvbihpKSB7CiAgICAgIGRhdGEuZnJhbWUoYWdlID0gYyhsc1tbaV1dW1sibWVhblN5c3RlbUFnZSJdXSwKICAgICAgICAgICAgICAgICAgICAgICAgIGxzW1tpXV1bWyJtZWFuUG9vbEFnZSJdXSksCiAgICAgICAgICAgICAgICAgY29tcG9uZW50ID0gYygic3lzdGVtIiwgImZhc3QgcG9vbCIsICJzbG93IHBvb2wiKSkKICAgIH0pCiAgfSkKKQpTQS5kZiRQTWVjb19kZXB0aCA8LSByZXAobmFtZXMoU0EuMnBwLmxzKSwgZWFjaCA9IDMsIHRpbWVzID0gbGVuZ3RoKFNBLjJwLmxzKSkKU0EuZGYkTW9kZWwgPC0gcmVwKGMoIjJwcCIsICIycHMiLCAiMnBwIFsuNSwgLjk1XSIpLCBlYWNoID0gMjcpClRULjJwLmxzIDwtIGxpc3QoVFQuMnBwLmxzLCBUVC4ycHMubHMsIFRULjJwcC5wMy41Ljk1LmxzKQpUVC5kZiA8LSBiaW5kX3Jvd3MoCiAgbGFwcGx5KFRULjJwLmxzLCBmdW5jdGlvbihscykgewogICAgbGFwcGx5KHNlcV9hbG9uZyhscyksIGZ1bmN0aW9uKGkpIHsKICAgICBkYXRhLmZyYW1lKGFnZSA9IGxzW1tpXV1bWyJtZWFuVHJhbnNpdFRpbWUiXV0sCiAgICAgICAgICAgICAgICBjb21wb25lbnQgPSAidHJhbnNpdCIpCiAgICB9KQogIH0pCikKVFQuZGYkUE1lY29fZGVwdGggPC0gcmVwKG5hbWVzKFRULjJwcC5scyksIHRpbWVzID0gbGVuZ3RoKFRULjJwLmxzKSkKVFQuZGYkTW9kZWwgPC0gcmVwKGMoIjJwcCIsICIycHMiLCAiMnBwIFsuNSwgLjk1XSIpLCBlYWNoID0gOSkKU0EuVFQuZGYgPC0gcmJpbmQoU0EuZGYsIFRULmRmKQpTQS5UVC5kZiRQTSA8LSBzdWJzdHIoU0EuVFQuZGYkUE1lY29fZGVwdGgsIHN0YXJ0ID0gMSwgc3RvcCA9IDIpClNBLlRULmRmJGVjbyA8LSBzdWJzdHIoU0EuVFQuZGYkUE1lY29fZGVwdGgsIHN0YXJ0ID0gMywgc3RvcCA9IDQpCgojIyBQbG90IGFnZXMgYW5kIHRyYW5zaXQgdGltZXMKIyBieSBQTQpTQS5UVC5kZiAlPiUKICBzZWxlY3QoIWMoUE1lY29fZGVwdGgsIGVjbykpICU+JQogIGdyb3VwX2J5KGNvbXBvbmVudCwgUE0sIE1vZGVsKSAlPiUKICBzdW1tYXJpemVfYWxsKGxpc3QobWVhbl9hZ2UgPSBtZWFuLCBzZCA9IHNkKSkgJT4lCiAgbXV0YXRlKGVycl91ID0gbWVhbl9hZ2UgKyBzZCwKICAgICAgICAgZXJyX2wgPSBtZWFuX2FnZSAtIHNkKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKE1vZGVsLCBtZWFuX2FnZSwgZmlsbCA9IFBNKSkgKwogIGdlb21fY29sKHBvc2l0aW9uID0gImRvZGdlIikgKwogICMgZ2VvbV9lcnJvcmJhcigKICAjICAgYWVzKHltYXggPSBlcnJfdSwgeW1pbiA9IGVycl9sKSwgCiAgIyAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAuOSksCiAgIyAgIHdpZHRoID0gLjMpICsKICBzY2FsZV9maWxsX21hbnVhbChuYW1lID0gIlBhcmVudCBtYXRlcmlhbCIsCiAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiQU4iID0gImFuZGVzaXRlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCUyIgPSAiYmFzYWx0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHUiIgPSAiZ3Jhbml0ZSIpLAogICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoIkFOIiA9ICJibHVlIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQlMiID0gInJlZCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdSIiA9ICJkYXJrZ3JheSIpKSArCiAgZmFjZXRfd3JhcCguIH4gY29tcG9uZW50LCBzY2FsZXMgPSAiZnJlZSIpICsKICB5bGFiKCJtZWFuIGFnZSIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpKQojIGJ5IGVjbwpTQS5UVC5kZiAlPiUKICBzZWxlY3QoIWMoUE1lY29fZGVwdGgsIFBNKSkgJT4lCiAgZ3JvdXBfYnkoY29tcG9uZW50LCBlY28sIE1vZGVsKSAlPiUKICBzdW1tYXJpemVfYWxsKGxpc3QobWVhbl9hZ2UgPSBtZWFuLCBzZCA9IHNkKSkgJT4lCiAgbXV0YXRlKGVycl91ID0gbWVhbl9hZ2UgKyBzZCwKICAgICAgICAgZXJyX2wgPSBtZWFuX2FnZSAtIHNkKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKE1vZGVsLCBtZWFuX2FnZSwgZmlsbCA9IGVjbykpICsKICBnZW9tX2NvbChwb3NpdGlvbiA9ICJkb2RnZSIpICsKICAjIGdlb21fZXJyb3JiYXIoCiAgIyAgIGFlcyh5bWF4ID0gZXJyX3UsIHltaW4gPSBlcnJfbCksCiAgIyAgIHBvc2l0aW9uID0gcG9zaXRpb25fZG9kZ2Uod2lkdGggPSAuOSksCiAgIyAgIHdpZHRoID0gLjMpICsKICBmYWNldF93cmFwKC4gfiBjb21wb25lbnQsIHNjYWxlcyA9ICJmcmVlIikgKwogIHlsYWIoIm1lYW4gYWdlIikgKwogIHRoZW1lX2J3KCkgKwogIHRoZW1lKHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2JsYW5rKCkpCmBgYAoKIyMjIEJheWVzaWFuIHBhcmFtZXRlciBlc3RpbWF0aW9uIChNQ01DKQoKVGhpcyBzZWN0aW9uIG5lZWRzIHNvbWUgd29yay4KCmBgYHtyIE1DTUMtZml0cywgZXZhbCA9IEZBTFNFfQojIHRoZSBmb2xsb3dpbmcgLlJEYXRhIGZpbGUgaXMgZ2VuZXJhdGVkIGJ5IHNjcmlwdCAic3JhLXRzL3NvdXJjZS9zcmEtdHMtbWNtYy1iYXllcy5SIgojIGxvYWQoZmlsZSA9ICIuLi9kYXRhL2Rlcml2ZWQvYmF5ZXMtcGFyLWZpdC0yMDIwLTExLTA2L2JheWVzX2ZpdF8ycHAtNTAwMGl0ci5SRGF0YSIpCgojIHBsb3QgcGFyYW1ldGVyIGNvbnZlcmdlbmNlCmxhcHBseShiYXllc19maXRfMnBwXzBfMTAsIHBsb3QpCgojIHBsb3QgY29sbGluZWFyaXR5CmxhcHBseShiYXllc19maXRfMnBwXzBfMTAsIHBhaXJzLCBuc2FtcGxlID0gZmxvb3IoaXRlci80KSkKCiMjIGxvb2sgYXQgbW9kZWwgcGVyZm9ybWFuY2UKcGFycy5iYXllcy5kZiA8LSBiaW5kX3Jvd3MobGFwcGx5KHNlcV9hbG9uZyhiYXllc19maXRfMnBwXzBfMTApLCBmdW5jdGlvbihpKSB7CiAgZGYgPC0gZGF0YS5mcmFtZShrMSA9IHVuaXF1ZShiYXllc19maXRfMnBwW1tpXV1bWyJwYXJzIl1dWywgMV0pLAogICAgICAgICAgICAgICAgICAgazIgPSB1bmlxdWUoYmF5ZXNfZml0XzJwcFtbaV1dW1sicGFycyJdXVssIDJdKSwKICAgICAgICAgICAgICAgICAgIGdhbSA9IHVuaXF1ZShiYXllc19maXRfMnBwW1tpXV1bWyJwYXJzIl1dWywgM10pKQogIGRmIDwtIGNiaW5kKFBNZWNvX2RlcHRoID0gcmVwKG5hbWVzKHBhcnMuZml0KVt0ZXN0Lml4XVtpXSksIAogICAgICAgICAgICAgIGRmKQp9KSkKcGFycy5iYXllcy5kZiRQTSA8LSBmYWN0b3Ioc3Vic3RyKHBhcnMuYmF5ZXMuZGYkUE1lY29fZGVwdGgsIDEsIDIpKQpwYXJzLmJheWVzLmRmJGVjbyA8LSBmYWN0b3Ioc3Vic3RyKHBhcnMuYmF5ZXMuZGYkUE1lY29fZGVwdGgsIDMsIDQpLCBsZXZlbHMgPSBjKCJwcCIsICJ3ZiIsICJyZiIpKQpzdW1tYXJ5KGxtKGsyIH4gUE0sIHBhcnMuYmF5ZXMuZGYpKQpzdW1tYXJ5KGxtKGsxIH4gZWNvLCBwYXJzLmJheWVzLmRmKSkKCiMgYmVzdCBwYXIgc2V0CmJlc3RQYXJzLmJheWVzLmxzIDwtIGxhcHBseShiYXllc19maXRfMnBwXzBfMTAsIGZ1bmN0aW9uKHgpIHsKICByb3VuZChkYXRhLmZyYW1lKGsxID0geCRiZXN0cGFyWzFdLAogICAgICAgICAgICAgICAgICAgazIgPSB4JGJlc3RwYXJbMl0sCiAgICAgICAgICAgICAgICAgICBnYW0gPSB4JGJlc3RwYXJbM10pLAogICAgICAgIDQpCn0pCmJlc3RQYXJzLmJheWVzLmRmIDwtIGNiaW5kKFBNID0gcmVwKGMoIkFOIiwgIkJTIiwgIkdSIiksIGVhY2ggPSAzKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgZWNvID0gcmVwKGMoInBwIiwgInJmIiwgIndmIiksIDMpLAogICAgICAgICAgICAgICAgICAgICAgICAgICBkZXB0aCA9IHJlcCgiMC0xMCIsIDkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICBiaW5kX3Jvd3MoYmVzdFBhcnMuYmF5ZXMubHMpKQoKIyBzdW1tYXJpemUgYnkgUE0KcGFycy5iYXllcy5QTSA8LSBiZXN0UGFycy5iYXllcy5kZiAlPiUKICBzZWxlY3QoIWMoZWNvLCBkZXB0aCkpICU+JQogIGdyb3VwX2J5KFBNKSAlPiUKICBzdW1tYXJpemVfYWxsKGxpc3QobWVhbiA9IG1lYW4sIHNkID0gc2QpKSAlPiUKICBtdXRhdGVfaWYoaXMubnVtZXJpYywgZm9ybWF0LCBkaWdpdHMgPSAzKQojIHN1bW1hcml6ZSBieSBFQ08KcGFycy5iYXllcy5lY28gPC0gYmVzdFBhcnMuYmF5ZXMuZGYgJT4lCiAgc2VsZWN0KCFjKFBNLCBkZXB0aCkpICU+JQogIGdyb3VwX2J5KGVjbykgJT4lCiAgc3VtbWFyaXplX2FsbChsaXN0KG1lYW4gPSBtZWFuLCBzZCA9IHNkKSkgJT4lCiAgbXV0YXRlX2lmKGlzLm51bWVyaWMsIGZvcm1hdCwgZGlnaXRzID0gMykKCiMgcGxvdCBiZXN0IHBhcnMKYmVzdFBhcnMuYmF5ZXMuZGYgJT4lCiAgcGl2b3RfbG9uZ2VyKCEoUE06ZGVwdGgpLCBuYW1lc190byA9ICJwYXIiLCB2YWx1ZXNfdG8gPSAidmFsdWUiKSAlPiUKICBtdXRhdGUoUE0gPSBmYWN0b3IoUE0pLAogICAgICAgICBlY28gPSBmYWN0b3IoZWNvLCBsZXZlbHMgPSBjKCJwcCIsICJ3ZiIsICJyZiIpKSkgJT4lCiAgZ2dwbG90KC4sIGFlcyhwYXIsIHZhbHVlLCBjb2xvciA9IFBNLCBzaGFwZSA9IGVjbykpICsKICBnZW9tX2ppdHRlcihzaXplID0gNCkgKwogIHNjYWxlX2NvbG9yX21hbnVhbChuYW1lID0gInBhcmVudCBtYXRlcmlhbCIsCiAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiQU4iID0gImFuZGVzaXRlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCUyIgPSAiYmFzYWx0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHUiIgPSAiZ3Jhbml0ZSIpLAogICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoIkFOIiA9ICJibHVlIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQlMiID0gInJlZCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdSIiA9ICJkYXJrZ3JheSIpKSArCiAgZmFjZXRfd3JhcCguIH4gcGFyLCBzY2FsZXMgPSAiZnJlZSIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpKQoKIyBwbG90IGFjY2VwdGVkIHBhcnMgYnkgUE0gYW5kIHRoZW4gYnkgZWNvCnBhcnMuYmF5ZXMuZGYgJT4lCiAgcGl2b3RfbG9uZ2VyKCFjKFBNLCBlY28sIFBNZWNvX2RlcHRoKSwgbmFtZXNfdG8gPSAicGFyIiwgdmFsdWVzX3RvID0gInZhbHVlIikgJT4lCiAgbXV0YXRlKFBNID0gZmFjdG9yKFBNKSwKICAgICAgICAgZWNvID0gZmFjdG9yKGVjbywgbGV2ZWxzID0gYygicHAiLCAid2YiLCAicmYiKSkpICU+JQogIGdncGxvdCguLCBhZXMocGFyLCB2YWx1ZSwgZmlsbCA9IFBNKSkgKwogIGdlb21fYm94cGxvdCgpICsKICBzY2FsZV9maWxsX21hbnVhbChuYW1lID0gInBhcmVudCBtYXRlcmlhbCIsCiAgICAgICAgICAgICAgICAgICAgbGFiZWxzID0gYygiQU4iID0gImFuZGVzaXRlIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCUyIgPSAiYmFzYWx0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJHUiIgPSAiZ3Jhbml0ZSIpLAogICAgICAgICAgICAgICAgICAgIHZhbHVlcyA9IGMoIkFOIiA9ICJibHVlIiwgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQlMiID0gInJlZCIsIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkdSIiA9ICJkYXJrZ3JheSIpKSArCiAgZmFjZXRfd3JhcCguIH4gcGFyLCBzY2FsZXMgPSAiZnJlZSIpICsKICB0aGVtZV9idygpICsKICB0aGVtZShwYW5lbC5ncmlkLm1pbm9yID0gZWxlbWVudF9ibGFuaygpKQpwYXJzLmJheWVzLmRmICU+JQogIHBpdm90X2xvbmdlcighYyhQTSwgZWNvLCBQTWVjb19kZXB0aCksIG5hbWVzX3RvID0gInBhciIsIHZhbHVlc190byA9ICJ2YWx1ZSIpICU+JQogIG11dGF0ZShQTSA9IGZhY3RvcihQTSksCiAgICAgICAgIGVjbyA9IGZhY3RvcihlY28sIGxldmVscyA9IGMoInBwIiwgIndmIiwgInJmIikpKSAlPiUKICBnZ3Bsb3QoLiwgYWVzKHBhciwgdmFsdWUsIGZpbGwgPSBlY28pKSArCiAgZ2VvbV9ib3hwbG90KCkgKwogIGZhY2V0X3dyYXAoLiB+IHBhciwgc2NhbGVzID0gImZyZWUiKSArCiAgdGhlbWVfYncoKSArCiAgdGhlbWUocGFuZWwuZ3JpZC5taW5vciA9IGVsZW1lbnRfYmxhbmsoKSkKYGBg